2015年5月9日土曜日

FON2405EのGPIOでキャラクタ液晶を制御する(WEB制御)

目的

前回、送達確認を拡張して受信機能(PICマイコンからFONに対してコマンドを出せる)ようにした。
今回は、コマンドラインの操作をWEBから行えるように変更した。

概要

WEBからクリア、行移動、文字出力を行う。
PICからの受信は次回の課題。




結果



#!/bin/sh
echo "Content-type: text/html"
echo
CMD_QSTR="OFF"
CMD_QSTR=`echo "$QUERY_STRING" | sed -n 's/^.*cmd=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
DATA_QSTR=""
DATA_QSTR=`echo "$QUERY_STRING" | sed -n 's/^.*data=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
STATE_CLEAR=""
STATE_LINE1=""
STATE_LINE2=""
STATE_DATA=""
CMD_RESULT=""
# gpioname NET,LAN,WPS
# mode off,on,fastbrink,slowbrink
if [ "$CMD_QSTR" = "CLEAR" ]; then
CMD_RESULT=`/mnt/mygpio5a.exe s 12 11 14 1000 "CC"`
STATE_CLEAR="checked"
elif [ "$CMD_QSTR" = "LINE1" ]; then
CMD_RESULT=`/mnt/mygpio5a.exe s 12 11 14 1000 "C1"`
STATE_LINE1="checked"
elif [ "$CMD_QSTR" = "LINE2" ]; then
CMD_RESULT=`/mnt/mygpio5a.exe s 12 11 14 1000 "C2"`
STATE_LINE2="checked"
elif [ "$CMD_QSTR" = "DATA" ]; then
CMD_RESULT=`/mnt/mygpio5a.exe s 12 11 14 1000 "N"$DATA_QSTR`
STATE_DATA="checked"
fi
echo "<html><head><title>FON2405eのGPIOでキャラクタ液晶を操作する</title></head>"
echo "<body>"
echo "<h1>GPIOの制御(キャラクタ液晶の制御)</h1>"
echo "<div style='width:400px;border:#aaaaaa solid 1px;'>"
echo "<form method='get' action='test_lcd.cgi' id='cmd'>"
echo "<p><b>コマンド送信</b></p>"
echo "<div><input type='radio' name='cmd' value='CLEAR' $STATE_CLEAR>クリア</div>"
echo "<div><input type='radio' name='cmd' value='LINE1' $STATE_LINE1>1行目へ移動</div>"
echo "<div><input type='radio' name='cmd' value='LINE2' $STATE_LINE2>2行目へ移動</div>"
echo "<div><input type='radio' name='cmd' value='DATA' $STATE_DATA>文字出力</div>"
echo "<div><input type='input' name='data' size='32' maxlength='16' value='$DATA_QSTR'></div>"
echo "<p><input type='submit' value='送信'></p>"
echo "</form></div>"
echo "QUERY="$CMD_QSTR"<br>"
echo "DATA="$DATA_QSTR"<br>"
echo "RESULT="$CMD_RESULT"<br>"
echo "</body></html>"
view raw test_lcd.cgi hosted with ❤ by GitHub

FON2405EのGPIOでキャラクタ液晶を制御する(受信機能追加2)

目的

前回、受信機能を追加したが、1Byteのみだった。
今回は、複数Byteの受信を拡張した。

結果

前回同様に1秒毎に顔文字「Adeno(^o^)mm-ss」※mm-ssは分-秒を送信し続けると、
400回のコマンド送信に対して、送信NGは52回 13%くらい
なんか前よりも増えた気がする…。
受信の方は、PICから「Hello!!」を送信。100回中NGは5回 5%くらいか
こっちはこんなもんか??

これで、双方向の複数バイトデータを扱えるようになった。
ようやくここまで来た。
ラズベリーパイでも良いのだけれど、ちょっと高い。
このFONならば、中古だけど、ACアダプタと本体で 500円〜なので、
心置きなく遊び倒せる。

何をやったか


電文
変更点
#include <stdio.h>
#include "rcv_lib.h"
#include "lcd_lib.h"
volatile unsigned char rcv_state = 0;
volatile unsigned char rcv_poi = 0;
volatile unsigned char rcv_cmd = ' ';
volatile unsigned char rcv_buf[RCV_SIZE];
volatile unsigned char rcv_timeoutflg = 0;
volatile unsigned char rcv_timeout = 0;
volatile unsigned char rcv_full = 0;
volatile unsigned char rcv_chksum = 0;
volatile unsigned char rcv_chksum_base = 0;
volatile unsigned char rcv_drv_state = 0;
void rcv_init(){
//受信バッファの準備
for(rcv_poi = 0; rcv_poi < RCV_SIZE; rcv_poi++){
rcv_buf[rcv_poi] = ' ';
}
//drv
rcv_drv_state = RCV_DRV_STATE_S0_STXWAIT;
rcv_chksum = 0;
rcv_chksum_base = 0;
//app
rcv_full = 0;
rcv_state = RCV_STATE_S1_CMDWAIT;
rcv_cmd = ' ';
}
char read_byte(int i){ return rcv_buf[i]; }
void clearRCVflg(){ rcv_full = 0; }
char getRCVflg(){ return rcv_full; }
unsigned char getRCVcmd(){ return rcv_cmd; }
void rcv_byte(unsigned char c){
if(rcv_full == 1){
printf("BufFull>%c\r\n",c);
}else if(rcv_drv_state == RCV_DRV_STATE_S0_STXWAIT){
if(c == rSTX){
//printf("STX\r\n");
rcv_cmd = ' ';
rcv_state = RCV_STATE_S1_CMDWAIT;
rcv_drv_state = RCV_DRV_STATE_S1_CHKSUMWAIT;
}
}else if(rcv_drv_state == RCV_DRV_STATE_S1_CHKSUMWAIT){
rcv_chksum = 0;
rcv_chksum_base = c & 0x0f;
rcv_drv_state = RCV_DRV_STATE_S2_ETXWAIT;
//printf("Sum=%d\r\n",rcv_chksum_base);
}else if(rcv_drv_state == RCV_DRV_STATE_S2_ETXWAIT){
if(c == rETX){
rcv_chksum = rcv_chksum & 0xf;
if(rcv_chksum_base == rcv_chksum){
rcv_buf[rcv_poi] = '\n';
printf("ChkSumOK:%d\r\n",rcv_chksum);
rcv_full = 1;
}else{
rcv_state = RCV_STATE_S1_CMDWAIT;
printf("ChkSumNG:%d:%d\r\n",rcv_chksum_base,rcv_chksum);
rcv_full = 2;
}
rcv_drv_state = RCV_DRV_STATE_S0_STXWAIT;
}else{
rcv_chksum+= c;
if(rcv_state == RCV_STATE_S1_CMDWAIT){
if(c == 'C'){
rcv_state = RCV_STATE_S2_CMDWAIT2;
}else if(c == 'N'){
rcv_poi = 0;
rcv_state = RCV_STATE_S3_DATAWAIT;
}
}else if(rcv_state == RCV_STATE_S2_CMDWAIT2){
//コマンドを一時保存
rcv_cmd = c;
rcv_state = RCV_STATE_S1_CMDWAIT;
}else if(rcv_state == RCV_STATE_S3_DATAWAIT){
if(c == '\r'){
}else{
rcv_buf[rcv_poi] = c;
rcv_poi++;
//終了条件2:バッファがいっぱい
if(rcv_poi >= RCV_SIZE){
rcv_poi = 0;
rcv_state = RCV_STATE_S1_CMDWAIT;
printf("End2\r\n");
}
}
}
//printf("RCV>%c\r\n",c);
}
}
}
view raw rcv_lib.c hosted with ❤ by GitHub