Raspberry Pi ロボットカーは2018年に製作、旧Blynkアプリによる遠隔操作をしていましたが、2022年に新Blynk2に切替わり旧Blynkアプリが使用出来なくなりました。新Blynk2の無料版は制限があり使い難いです。スマホアプリでRaspberry Pi を操作するアプリがBlynkしか見当たらなく残念に思っていましたが、Blynk Legacyローカルサーバーで旧Blynkを使えることを知り、Blynk Legacyローカルサーバーを構築しました。
同ブログ関連記事:【Raspberry Pi ロボットカー回路図】
参考サイト
●Blynk(Legacy)を自前サーバー構築で無料かつ使い放題スマートホーム実現の方法【https://androshudan.com/blynk-local-server-5265.html】
Blynk Legacyローカルサーバー
Blynk Legacyローカルサーバーから旧BlynkアプリによるRaspberry Pi ロボットカーを操作。
●同ブログ関連記事:【Blynk (Legacy )ローカルサーバー構築】
スマホアプリBlynk (Legacy )
※Raspberry Pi ローカルサーバーを立ち上げておく。
●My Devices
【プロジェクト名】
【デバイス】選択
【コネクトタイプ】選択
スマホにボタン・画面配置
●Video Streaming Settings
URL ADDRESS
【http://192.168.1.XX:8080/?action=stream】
【192.168.1.XX】
Raspberry Pi ロボットカーIPアドレス
●Button Settings
Raspberry Pi ブラウザ
※Raspberry Pi 画面を表示する
(リモートデスクトップ接続 )
●Blynk (Legacy )ローカルサーバー ブラウザ
【//127.0.1.1:9443/admin#/users/edit/xxxxx@gmail.com-Blynk】
Tokenをコピー
●同ブログ関連記事:【Blynk (Legacy )ローカルサーバー構築】
●Raspberry Pi ロボットカー プログラム実行
ターミナル1
【cd blynk/blynk-library/linux
sudo ./blynk --server=192.168.1.81 --port=8080 --token=..........................U9IW】
ターミナル2
【cd mjpg-streamer
sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"】
●動画表示
【http://192.168.1.XX:8080/?action=stream】
Raspberry Pi ロボットカー プログラム
/home/pi/blynk/blynk-library/linux/main.cpp
/**
* @file main.cpp
* @author Volodymyr Shymanskyy
* @license This project is released under the MIT License (MIT)
* @copyright Copyright (c) 2015 Volodymyr Shymanskyy
* @date Mar 2015
* @brief
*/
//#define BLYNK_DEBUG
#define BLYNK_PRINT stdout
#ifdef RASPBERRY
#include <BlynkApiWiringPi.h>
#else
#include <BlynkApiLinux.h>
#endif
#include <BlynkSocket.h>
#include <BlynkOptionsParser.h>
static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);
static const char *auth, *serv;
static uint16_t port;
#include <BlynkWidgets.h>
BlynkTimer tmr;
void blynk_read_exec(int pin) {
char command[256] = "";
char buff[256] = "";
FILE *fp;
sprintf(command, "/home/npi/blynk/BLYNK_READ_V%d.sh", pin);
if((fp=popen(command,"r")) != NULL) {
if(fgets(buff, 255, fp) != NULL) strtok(buff, "\n\0");
}
pclose(fp);
Blynk.virtualWrite(pin, buff);
BLYNK_LOG("Command: %s -> %s", command, buff);
}
void blynk_write_exec(int pin, const BlynkParam& param) {
char command[256] = "";
char buff[256] = "";
sprintf(command, "/home/npi/blynk/BLYNK_WRITE_V%d.sh", pin);
for (int i=0; i<3; i++) {
if(! param[i].isValid()) break;
sprintf(buff, " %d", param[i].asInt());
strcat(command, buff);
}
BLYNK_LOG("Command: %s", command);
system(command);
}
BLYNK_READ(V0) { blynk_read_exec(V0); }
BLYNK_READ(V1) { blynk_read_exec(V1); }
BLYNK_READ(V2) { blynk_read_exec(V2); }
BLYNK_READ(V3) { blynk_read_exec(V3); }
BLYNK_READ(V4) { blynk_read_exec(V4); }
BLYNK_READ(V5) { blynk_read_exec(V5); }
BLYNK_READ(V6) { blynk_read_exec(V6); }
BLYNK_READ(V7) { blynk_read_exec(V7); }
BLYNK_READ(V8) { blynk_read_exec(V8); }
BLYNK_READ(V9) { blynk_read_exec(V9); }
BLYNK_WRITE(V10) { blynk_write_exec(V10,param); }
BLYNK_WRITE(V11) { blynk_write_exec(V11,param); }
BLYNK_WRITE(V12) { blynk_write_exec(V12,param); }
BLYNK_WRITE(V13) { blynk_write_exec(V13,param); }
BLYNK_WRITE(V14) { blynk_write_exec(V14,param); }
BLYNK_WRITE(V15) { blynk_write_exec(V15,param); }
BLYNK_WRITE(V16) { blynk_write_exec(V16,param); }
BLYNK_WRITE(V17) { blynk_write_exec(V17,param); }
BLYNK_WRITE(V18) { blynk_write_exec(V18,param); }
BLYNK_WRITE(V19) { blynk_write_exec(V19,param); }
void setup()
{
Blynk.begin(auth, serv, port);
tmr.setInterval(1000, [](){
Blynk.virtualWrite(V0, BlynkMillis()/1000);
});
}
void loop()
{
Blynk.run();
tmr.run();
}
int main(int argc, char* argv[])
{
parse_options(argc, argv, auth, serv, port);
setup();
while(true) {
loop();
}
return 0;
}
シェルスクリプト
BLYNK_READ_V1.sh /home/pi/blynk/py/dht11.py | grep ^Temp= | awk '{print $2}'
BLYNK_READ_V2.sh /home/pi/blynk/py/dht11.py | grep ^Humidity= | awk '{print $2}'
BLYNK_READ_V3.sh cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq \
| awk '{print $1 / 1000}'
BLYNK_READ_V4.sh cat /proc/loadavg | awk '{print $1*100}'
BLYNK_READ_V5.sh data=`cat /sys/class/thermal/thermal_zone0/temp | awk '{printf($1/1000)}'`
printf "%3.1f" $data
BLYNK_WRITE_V10.sh fswebcam /home/pi/photo/photo.png
BLYNK_WRITE_V12.sh SLIDER_FILE=/tmp/V12 echo $1 > $SLIDER_FILE /home/pi/blynk/py/servo3.py
BLYNK_WRITE_V13.sh SLIDER_FILE=/tmp/V13 echo $1 > $SLIDER_FILE
/home/pi/blynk/py/servo4.py
BLYNK_WRITE_V14.sh case "$1" in
"1")irsend SEND_ONCE TV 1
;;
"4")irsend SEND_ONCE TV 4
;;
"5")irsend SEND_ONCE TV 5
;;
"6")irsend SEND_ONCE TV 6
;;
"8")irsend SEND_ONCE TV 8
;;
esac
BLYNK_WRITE_V15.sh SLIDER_FILE=/tmp/V15 echo $1 > $SLIDER_FILE
/home/pi/blynk/py/servo0.py
BLYNK_WRITE_V16.sh SLIDER_FILE=/tmp/V16 echo $1 > $SLIDER_FILE
/home/pi/blynk/py/servo1.py
BLYNK_WRITE_V17.sh SLIDER_FILE=/tmp/V17 echo $1 > $SLIDER_FILE
/home/pi/blynk/py/servo2.py
BLYNK_WRITE_V18.sh case "$1" in
"0")/home/pi/blynk/py/car_R.py
;;
"1")/home/pi/blynk/py/car_S.py
;;
"2")/home/pi/blynk/py/car_L.py
;;
esac
BLYNK_WRITE_V19.sh case "$1" in
”0")/home/pi/blynk/py/car_B.py
;;
"1")
;;
"2")/home/pi/blynk/py/car_G.py
;;
esac
car_G.py 【/home/npi/blynk/py】
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
#go
GPIO.output(5, GPIO.HIGH)
GPIO.output(12, GPIO.LOW)
GPIO.output(6, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
car_B.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
#back
GPIO.output(5, GPIO.LOW)
GPIO.output(12, GPIO.HIGH)
GPIO.output(6, GPIO.LOW)
GPIO.output(13, GPIO.HIGH)
car_R.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
#right
GPIO.output(5, GPIO.HIGH)
GPIO.output(12, GPIO.LOW)
GPIO.output(6, GPIO.LOW)
GPIO.output(13, GPIO.HIGH)
car_L.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
#left
GPIO.output(5, GPIO.LOW)
GPIO.output(12, GPIO.HIGH)
GPIO.output(6, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
car_S.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
#stop
GPIO.output(5, GPIO.LOW)
GPIO.output(12, GPIO.LOW)
GPIO.output(6, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
0 件のコメント:
コメントを投稿