Arduino + Python Hacking 第3回

1.概要

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

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

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

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

今回は「圧電ブザー」を使った開発を行います。

【当日の流れ】

①午前 Arduinoを使って圧電ブザーを鳴らすソースを書きます。

    ハードウェアよりの話になります。

②午後 Pythonを使ってネットから音を作り曲を作ります。

    簡単な作曲方とランダムな作曲を楽しみます。

    いろんな方法で音を楽しむプログラムを作ります。

③放課後 雑談や復習を行う時間です。

2.開催日

日付 場所 内容 必要な物 参加費用 参加人数
2013年2月17日 秋葉原CERO 圧電ブザー PC,Arduino,USBケーブル 3000円 17人

3.内容

1) ソース Arduino側

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
#include "Arduino_python.h"
#include "string.h"

// the setup routine runs once when you press reset:
void setup() {
  Arduini_py_Init();

}


#define _Read_MAX_CHAR_ 50
// the loop routine runs over and over again forever:
void loop() {
  int tmp = 0;
  int strlen;
  char Cbuf[_Read_MAX_CHAR_];
  char Cbuf2[_Read_MAX_CHAR_];
  char *fs;
  char *sc;
  char *th; 
  strlen = Arduino_py_Command(Cbuf);
  
  if(strlen >0)
  {
    strcpy(Cbuf2, Cbuf); 
    //Serial.print(Cbuf);
    fs = strtok(Cbuf2,",");
    sc = strtok(NULL,",");
    th = strtok(NULL,",");
    
    tone(atoi(fs),atoi(sc),atoi(th));
    //tone(12,0,atoi(th));
 }
 
}

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
56
57
//==========================================================//  
// 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(9600);
   Serial.begin(115200);
}
//==========================================================// 

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

Pythonファイル

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


tmp_msg = "/dev/ttyUSB0"
ser = serial.Serial(tmp_msg)
ser.baudrate = 115200
ser.timeout = 1
print ser.portstr
time.sleep(1.5)

for i in range(0,10):
	ser.write("13,%d,80\n" % 440)
	time.sleep(1)


ser.close()

Pythonファイル 02

 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
56
57
58
59

 
import time
import serial
import sys


pi = """3.141592653589793238462643383279502884197169
3993751058209749445923078164062862089986280
3482534211706798214808651328230664709384460
9550582231725359408128481117450284102701938
52110555964462294895493038196"""

One = 440
Two = 493
Three = 523
Four = 587
Five = 659
Six = 698
Seven = 783
Eight = 880
Nine = 987
Zero = 1046

tmp_msg = "/dev/ttyUSB0"
ser = serial.Serial(tmp_msg)
ser.baudrate = 115200
ser.timeout = 1
print ser.portstr
time.sleep(2)

for i in range(0,len(pi)):
	print "    " + pi[i]
	if pi[i] == "0":
		ser.write("13,%d,100\n" % Zero)
	elif pi[i] == "1":
		ser.write("13,%d,100\n" % One)
	elif pi[i] == "2":
		ser.write("13,%d,100\n" % Two)
	elif pi[i] == "3":
		ser.write("13,%d,100\n" % Three)
	elif pi[i] == "4":
		ser.write("13,%d,100\n" % Four)
	elif pi[i] == "5":
		ser.write("13,%d,100\n" % Five)
	elif pi[i] == "6":
		ser.write("13,%d,100\n" % Six)
	elif pi[i] == "7":
		ser.write("13,%d,100\n" % Seven)
	elif pi[i] == "8":
		ser.write("13,%d,100\n" % Eight)
	elif pi[i] == "9":
		ser.write("13,%d,100\n" % Nine)
	else:
		ser.write("13,%d,100\n" % 2000)

	time.sleep(0.5)

ser.close()

Pythonファイル POST版

 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
import time
import serial
import sys
import httplib, urllib

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

_SEVER_ = "localhost"
_ADDR_ = "/post"

cnt = 0
while 1 :
	POSTLIST = {	"Hello"		:	"World" }
		
	params = urllib.urlencode( POSTLIST ) 
	headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
	conn = httplib.HTTPConnection( _SEVER_ )
	conn.request("POST",  _ADDR_ , params, headers)
	response = conn.getresponse()
	print response.status, response.reason
	data = response.read().replace("\n","").replace("\r","")
	print data
	conn.close()
	
	if data == "1" :
		for j in range(0,3):
			for i in range(0,3):
				ser.write("13,%d,80\n" % 1000)
				time.sleep(0.1)
				ser.write("13,%d,80\n" % 2000)
				time.sleep(0.1)
			time.sleep(1)
	time.sleep(0.5)
	data = "0"

ser.close()

4.開場の様子


v2016/Study/Arduinopy20130217/tmp.jpg

5.反省

7.参考資料

8.管理情報

作成者:北神雄太
Twitter:@nonNoise
開催日:2013/02/18
作成日:2013/02/18
分類:Python,Arduino
提供:北神博士
クリエイティブ・コモンズ・ライセンス