ラズベリーパイ3で遊ぶ                          kunioのHP
                                               H28.11.14
ラズパイ3でBlynkアプリを使ってIOTぽいことができそうなので遊んでみた。

ラズパイをセットアップして、いわゆるLチカ(LEDの点消灯)まではローカルネット上で簡単にできますが、これを
インターネットを介して行うとすると、一気にハードルが高くなりますがこれを比較的簡単に実現できる無料の
Blynkアプリの存在を知ったので、使ってみました。
 
 Lチカ、ハードSWによるスマホアプリのLチカ、ジョイスティックによるサーボモータ制御までやってみた。


構成
 スマホ(Blynk) 〜(au)〜インターネット〜(プロバイダー)〜 無線LAN 〜 ラズパイ3 〜 LED、SW、サーボモータ

ラズパイ3 ハード接続
  GPIO17−抵抗(330Ω)−GND
  GPIO22−抵抗(330Ω)−GND
  3.3V−抵抗(1kΩ)−pushSW−GPIO4・抵抗(1kΩ)−GND
  サーボモータ1 赤:5V、黒:GND、白:GPIO18(PWM0)
  サーボモータ2 赤:5V、黒:GND、白:GPIO13(PWM1)

Blynkの設定
 ボタン1 INPUT:GP17 MODE:SWITCH
 ボタン2 INPUT:GP22 MODE:SWITCH
 LED  INPUT:V2 MODE:SWITCH
 Joystick OUTPUT:MERGE V0 AUTO RETURN:ON

ラズパイ3のプログラム
  ※ラズパイのセットアップ、Blynkのインストール、コンパイル実行方法等は、末記リンク等を参照して下さい。
 
blynk-library/linux内のmain.cppの修正内容です。

@Lチカ
  プログラム追加不要

AハードSW読取、それに連動してスマホ側LEDをONOFF(Lチカの逆)
  こちらの情報はネット上に少なかったので、試行錯誤で実現しました
  BLYNK_READ()で試みましたが上手くいかなかったので、GPIO4の割り込み
  処理(スマホLED制御2)からled_onnoffを読み出しGPIO4のH/Lによりバーチャルピン2に
  255(ON)、0(OFF)書き込むことで、LEDが点消灯させる(スマホLED制御1

Bサーボモータ制御(サーボ:GWS PIC
  ラズパイのハードPWMを活用して、制御信号を作成
  PWM周波数 ベース周波数19.2MHz/クロック分周設定/分解能設定
           今回50Hz(20ms)=19.2M/375/1024
  パルス幅設定計算(ジョイスティック制御1
            PWMカウンタ周期51.2kHz=19.2M/375
            今回のサーボ0.75〜2.25ms(センター1.5ms)
            51.2kx0.75ms≒38、
51.2kx2.25ms≒116(センター 77)
            ジョイスティック入力は0−255
            換算式 入力値×(116−38)/256+38=入力値×78/256+38=入力値×39/128+38


(main.cppの内容) 赤字が追加部分

//これ以前は変更がないため略、これ以降に
#include <BlynkWidgets.h>

//コメントアウト
//BLYNK_WRITE(V1)
//{
//  printf("Got a value: %s\n", param[0].asStr());
//}

//ジョイスティック制御1
BLYNK_WRITE(V0) {
  int x = param[0].asInt()*39/128+38;
  int y = param[1].asInt()*39/128+38;
  pwmWrite(18, x);//ジョイスティック1のパルス幅設定
  pwmWrite(19, y);//ジョイスティック2のパルス幅設定
}

//スマホLED制御1
 void led_onoff(void)
{
  if(digitalRead(4) == 1)  Blynk.virtualWrite(2,255);
  else Blynk.virtualWrite(2,0);
}

int main(int argc, char* argv[])
{
    const char *auth, *serv, *port;
    parse_options(argc, argv, auth, serv, port);

    Blynk.begin(auth, serv, port);

//スマホLED制御2

    wiringPiISR(4, INT_EDGE_BOTH, led_onoff);

//ジョイスティック制御初期化

    pinMode(18, PWM_OUTPUT);//ピンモード設定
    pinMode(19, PWM_OUTPUT);//ピンモード設定
    pwmSetMode(PWM_MODE_MS);//マークスペースモード(デフォルトはバランスモード)
    pwmSetClock(375);//クロック分周設定
  pwmSetRange(1024);//分解能設定

    while(true) {
        Blynk.run();
    }

    return 0;
}

実行結果(動画参照)
 @Lチカは、レスポンスも良く問題なく動作。
 AハードSWよるスマホLチカは、応答に若干遅れはあるがほぼ問題なく反応。
 Bジョイステックによるサーボ制御も、応答は問題なし。
   ただし、ジョイステックでX−Y2方向同時制御は無理があり、操作がしにくくスティックが円形の移動のため
   同時に最大または最小にできない。ラジコンのように分離する方がよい。
   ラズパイのPWM波形制御は意外と簡単。ハードPWMは4(2種類(0,1)×2)あるが同じ種類でパルス幅は
   変えられないようであったので、今回0と1で分けて使用した。
 今度は、サーボ制御を応用してスマホラジコンに挑戦したい。


参考リンク
RaspberryPi電子工作入門
プログラムをしないでも「RaspberryPi」を遠隔操作できるスマホアプリ「Blynk」が凄い!!
Blynk
Raspberry Piブログ
RaspberryPiとWiringPiでサーボを動かす