Arduino + Python Hacking 第1回

1.概要

東京、秋葉原で開催しますPythonとArduinoを使った勉強会です。

基本的には、Pythonを使ってソフト的にハードウェアを制御していく勉強会です。

なので、ハードウェアの知識は元より、ソフトウェアの知識も特に必要ありません。

本勉強会はソフトウェア開発(Python)の開発に重点を置きます。

ハードウェアとPythonの相性について最高だと発表して来たが、実際にその相性の良さを体感して頂く為に、

Arduinoを使ってPythonとハードウェアの勉強会を開催する。

今回はArduinoでフルカラーLEDの制御関数を作成し、Pythonから色情報を送信する仕組みを作る。

基本的な動作は、PythonのPysirialと言うシリアル通信用ライブラリを使い、Arduinoの内部関数を制御する。

http://connpass.com/event/1107/

2.開催日

日付 場所 内容 必要な物 参加費用 参加人数
2012年10月21日 秋葉原CERO PythonでフルカラーLED制御 PC,Arduino,USBケーブル 1500円 12人

3.内容

(1)最初のインストール

以下のサイトにまとめました。 http://kitagami.org/Study/arduinopy_install.html

(2)Arduino側の開発 (ブレットボード配線)

以下の図にフルカラーLED制御用の配線図及び回路図を示す。

../../../_images/FullLED.jpg

(3) Arduino側の開発 (ファームウェア開発)

以下にArduinoをPythonで扱う為の処理とLEDを制御する処理を組み合わせたソースを記述する。

また、全ソース及びプロジェクトファイルはここに示す。

・ 全ソース C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "Arduino_python.h"
#include "string.h"

// digital pin 2 has a pushbutton attached to it. Give it a name:
int LED_R = 3;
int LED_B = 5;
int LED_G = 6;

// the setup routine runs once when you press reset:
void setup() {
  Arduini_py_Init();
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  digitalWrite(LED_R, HIGH);
  digitalWrite(LED_G, HIGH);
  digitalWrite(LED_B, HIGH);
}

#define _Read_MAX_CHAR_ 30
// the loop routine runs over and over again forever:
void loop() {
  int tmp = 0;
  int strlen;
  char Cbuf[_Read_MAX_CHAR_];
  char *fs;
  char *sc;
  strlen = Arduino_py_Command(Cbuf);
  
  if(strlen >0)
  {
    fs = strtok(Cbuf,",");
    sc = strtok(NULL,",");
    tmp = atoi(sc);
    Serial.print(tmp);
    if(strcmp(fs,"RED")==0)
      analogWrite(LED_R,256-tmp);
    else if(strcmp(fs,"GREEN")==0)
      analogWrite(LED_G,256-tmp);
    else if(strcmp(fs,"BLUE")==0)
      analogWrite(LED_B,256-tmp);
    
 }
 
}



・ 全ソース H

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//==========================================================//  
// Project Name :    Arduino_Python 
// File Name :         Arduino_Python.h
// Date :                  2012/09/30  
// Version :             0.01 
// Programer :         Yuta Kitagami 
// Description :       	 
// Revision History :  
//        2012/09/30 : New File 
//==========================================================// 


#include "Arduino.h"


int gRxbuf_cnt;

	void Arduini_py_Init(void);
	char Arduino_py_Command(char * RxBuf);

void Arduini_py_Init(void)
{
   gRxbuf_cnt = 0;
    Serial.begin(115200);
}
//==========================================================// 

char Arduino_py_Command(char * RxBuf)
{
  char tmp; 

  if (Serial.available() > 0) 
  {
    tmp = Serial.read();
    if(gRxbuf_cnt > 30)
      gRxbuf_cnt = 0;
      
    if( (tmp != '\n') && (tmp != '\r') )
    {
      RxBuf[gRxbuf_cnt]	= tmp;
      gRxbuf_cnt++;
      RxBuf[gRxbuf_cnt]	= '\0';
    }
    else
    {
      RxBuf[gRxbuf_cnt]	= '\0';
      gRxbuf_cnt = 0;
      Serial.write(RxBuf);
      if(strlen(RxBuf) >0)
        return strlen(RxBuf);
    }
  }
}
//==========================================================// 

また、開発したファームウェアには以下の機能があり、この表に従いPythonの開発を行う。

コマンド 値(範囲) 内容 戻り値 備考
RED 0〜255 赤色の光の強さを調整 なし 0が消灯で255が最大
GREEN 0〜255 赤色の光の強さを調整 なし 0が消灯で255が最大
BLUE 0〜255 赤色の光の強さを調整 なし 0が消灯で255が最大

(4) Python側の開発

以下にPython側のソースを記述する。

基本的にはPysirialを使って

「RED 128」 や 「GREEN 64」 と言った形で色を記述し制御する。

すると、Arduinoが自動的にRED,GREEN,BLUEのの三色を合成した色を出力する。

また、白を表現した際は三色共に255に設定すれば良い。

・ 全ソース Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import time
import serial
import sys

tmp_msg = "/dev/tty.usbserial-A800eGnD"
ser = serial.Serial(tmp_msg)
ser.baudrate = 115200
ser.timeout = 1
print ser.portstr

for i in range(0,255):
	ser.write("RED,%d\n" % 0)

	print i
	time.sleep(0.1)

ser.close()

4.開場の様子


Study/Arduinopy20121021/IMG_1113.JPG Study/Arduinopy20121021/IMG_1115.JPG Study/Arduinopy20121021/IMG_1117.JPG Study/Arduinopy20121021/IMG_1118.JPG Study/Arduinopy20121021/IMG_1119.JPG

5.次回スケジュール

日付 場所 内容 必要な物 参加費用
1月20日 秋葉原CERO python-twitter PC,Arduino,USBケーブル 3000円

次回は温度センサを使ってTwitterに投稿する物を作りますw

6.反省

最後までお付き合い有難うございます。 初めての勉強会で不手際も御座いましたが、何と12人の方に御参加頂き大変ありがたく思います。

今回、初めて大々的な勉強会を自身で主催しまして、色々直したい点が有ったのでちょっとまとめてみます。

  • Python系勉強会だとOSが色とりどりになる。

    一応、Macが一番多いがWindowsもLinuxも結構いる感じ。むしろWinが少ない感じでとても新鮮でよかった。

    ただ、色んなOSに説明を対応させるには色々テクが必要だなと勉強になりました。

  • インストールが思った以上に大変であった。

    大半のインストールは説明が殆どWEBからのダウンロードで済むから行けるだろうと思ったが、 10何人も集まるとWiFi回線が飽和し思うように進まなかった。

    次回は事前にインストールをお願いするのと、予備でUSBにWin,Mac,Linuxのインストールパッケージを準備して置こうと思った。

  • 予想外の問題は必ず起こる。

    事前にインストール手順や開発手順を熟知した気持ちで居たが、イレギュラーは必ず起きるんだと思った。

    特にドライバー関連の問題が発生し、似た様な環境でもうまく行く人うまく行かない人が出て頭を悩ませた。

    多分この手の解決法は見つからないと思うが、もし発生した場合は落ち着いて対処し、別の作業を御願いするか判断する。

以上の点を次回に行かせればと思います。

7.参考資料

準備中

8.管理情報

作成者:北神 雄太
Twitter:@nonNoise
開催日:2012/10/21
作成日:2012/12/17
分類:Arduino,Python
提供:ArtifactNoise http://ArtifactNoise.com
クリエイティブ・コモンズ・ライセンス