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()
|