2024年9月1日日曜日

Blynk (Legacy )Raspberry Pi ロボットカー操作

Raspberry Pi ロボットカー


 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ローカルサーバー
(Raspberry Pi 3B+)
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 件のコメント:

コメントを投稿

FST3253 - 直交ミキサ製作

アマゾンの口コミ(SDRトランシーバーに使用出来る)を見てFST3253MTCとピッチ変換基板を購入、FST3253 直交ミキサ基板を製作してPi Pico Rxで受信確認できました。  ●Pi Pico Rx  【 https://101-things.readthedocs....