Raspberry PiとAruduinoでシリアル通信 | memo

memo

いつで見れるメモ用

ddkit0704を使ってブレッドボードに挿せるように作ったケーブルと、
同じ構成で、ブレッドボードに挿す側がメスになったケーブルがお家にころがってた。

というわけで、、、

Raspberry PiでGPIOに直接LEDをつないでLチカでもよかったんだが、今回はあえて、、、

1.片方のケーブルをArduinoのTXやらRXに、もう片方をRaspberry PiのTXやらRXにつないで、それらをリバース変換して接続
2.WebからRaspberry Piにアクセスして、シリアル通信コマンドを送信
3.Arduino側で受信したコマンドに従って3色LEDを制御

ってな感じで遊んでみた。

思いたったことをやってみて、書いてるだけなので、理解しがたい文章なのはご了承くださいw

Raspberry PiでRailsが動くようにする方法はこちらを参照。

◆Arduino側
D2:3色LEDの青
D3:3色LEDの緑
D4:3色LEDの赤
を接続。

スケッチ
#include <adb.h>

#define MAX_RESET 8
#define LED_R 4
#define LED_B 2
#define LED_G 3

#define DELAY_MS 100

#define LED_ON 0xF0
#define LED_OFF 0x0

#define BAUDRATE 115200

int nR;
int nG;
int nB;

void led_off()
{
    analogWrite(LED_R, LED_OFF); // 赤を消す
    analogWrite(LED_G, LED_OFF); // 緑を消す
    analogWrite(LED_B, LED_OFF); // 青を消す
    nR = 0;
    nG = 0;
    nB = 0;
}

void led_on(bool R, bool G, bool B)
{
    analogWrite(LED_R, (R)? LED_ON: LED_OFF);
    analogWrite(LED_G, (G)? LED_ON: LED_OFF);
    analogWrite(LED_B, (B)? LED_ON: LED_OFF);
}

void led_on(int nLed, bool bON)
{
    analogWrite(nLed, (bON)? LED_ON: LED_OFF);
}


void setup()
{
    for(int nB=0; nB<2; nB++)
    {
        for(int nR=0; nR<2; nR++)
        {
            for(int nG=0; nG<2; nG++)
            {
                led_on(nR==1, nG==1, nB==1);
                delay(DELAY_MS);
            }
        }
    }
    led_off();

    Serial.begin(BAUDRATE);
}

void loop()
{
    if(Serial.available() > 0)
    {
        switch (Serial.read())
        {
            case 'r':
                led_on(LED_R, true);
                break;
            case 'g':
                led_on(LED_G, true);
                break;
            case 'b':
                led_on(LED_B, true);
                break;
            case 'R':
                led_on(LED_R, false);
                break;
            case 'G':
                led_on(LED_G, false);
                break;
            case 'B':
                led_on(LED_B, false);
                break;
            default:
                break;
        }
    }
}


◆Raspberry Pi側
Raspberry Pi本体とddkit0704を接続する。

serial

ピンアサインの詳細はこちらを参照。

次に/boot/cmdline.txtを編集します。
$ sudo vim /boot/cmdline.txt
ファイルの内容を、まるごと
dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait
というようにしてしまう。

後は、/etc/inittabを編集してシリアルからのログインをさせないようにする。
$ sudo vim /etc/inittab
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
を下記のようにコメントにする。
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
$ sudo reboot
これでシリアル通信ができる状態になりました。

Railsでプログラムを組んでいきます。
$ rails new serialTest
$ bundle install
でプロジェクト作成。

app/controllers/send_serial_controller.rb
class SendSerialController < ApplicationController
  def index
    str = params[:serialVal]
    com = open("/dev/ttyAMA0","r+")
    system(" stty < /dev/ttyAMA0 115200")
    com.write str
    com.close
  end
end

app/views/serial_test/index.html.erb
<script type="text/javascript">
function sendSerial(data)
{
    $.ajax({
        type: "POST",
        url: "/sendSerial/index",
        data: "serialVal=" + data + "&msc=" + (new Date()).getTime(),
        success: function(msg){
        }
    });
}
</script>

コマンド:<input id="command" style="width:128px;" type="text"><input onclick='sendSerial(document.getElementById("command").value);' value="送信" type="button">

config/routes.rb
  match '/serialTest/index'
  match '/sendSerial/index'
(上記を追記)

あとは、
$ cd serialTest
$ rails s
ってやっておいて、
http://xxx.xxx.xxx.xxx:3000/serialTest/index
にアクセス。

コマンド欄に文字を入力して送信ボタンでLEDが制御できるはず。

r:赤点灯
R:赤消灯
g:緑点灯
G:緑消灯
b:青点灯
B:青消灯