研究の掃溜ノオト
since 2011/2/13 知能ロボ研究の合間に思ったこととか書いてます。
ArduinoとProcessingを用いてCdSセルからの情報をPCに表示する
というわけで今回は電子回路とPCをつなげることに挑戦してみましたー!
ちょうど手元にCdSセルが余っていたのでArduino UNOを使ってなにか作れないかなーと。
しかしもともとPC側はPython で実装しようとしていたのですがpyGame が謎のエラーをだして使えなくなってしまい急遽Processing を用いて実装することにしました。
Processing を使ったのは今回が初めてなんですが、グラフィックに関してとてもとてもとおおおおっても使いやすい言語なのでこれからも重宝しそうです!
さて仕組みとしては
①PC部分
②Arduino部分
③電子回路部分
に分かれているのですがまず③から説明します。
上図が簡単な回路図になります。CdSセルは秋月で買ったものです。
仕組みとしてはCdSセルの抵抗値を分圧を利用してA/Dポートで読んでいるという大変シンプルなものですが複数のCdSセルを一つのポートで読むための工夫が施してあります。
それを説明するためにまずはArduino のソースを貼ります。
Arduino
===============================
getCdS()関数を見てもらえばわかるように各I/Oポートの出力は読みたいCdSセルに対応するポートだけHighをそれ以外はLowを指定しています。こうすることによってダイオードが絶縁してくれるおかげで読みたいCdSセルの値だけを読むことができるのです。
なおこの方法については @chibiegg 氏に教わりましたのでこの場を借りて感謝m(__)m
次にArduinoからPCへの通信ですが、通信方式にはSerial通信を使います。
通信アルゴリズムに関してはこのサイトを大いに参考にさせてもらいましたので詳しいことはそこで見てもらうことにしてここでは概説でとどめます。
そのまえにProcessing 側のソースも貼りますねv
Processingソース
===============================
まず画面をクリックすることでProcessing からArduino に0xFF が送られそれによって available()関数の値が0より大きくなるのでArduino 側はCdSセルの情報を測ってProcessing に送ります。 available()関数は今何バイト送られてきてるかを返すのでこれを使ってArduino からProcessing に5個以上送られてきたらその値を読み取って再びProcessing からArduino にデータを送れと0xFF を送ります。
まぁそんな感じで動いてるわけです!
Processing のコードの解説はしませんでしたが興味がある人は勉強してみてください。
なれた人ならこの描画ができるまでに30分もかかりませんw
PR
ちょうど手元にCdSセルが余っていたのでArduino UNOを使ってなにか作れないかなーと。
しかしもともとPC側はPython で実装しようとしていたのですがpyGame が謎のエラーをだして使えなくなってしまい急遽Processing を用いて実装することにしました。
Processing を使ったのは今回が初めてなんですが、グラフィックに関してとてもとてもとおおおおっても使いやすい言語なのでこれからも重宝しそうです!
さて仕組みとしては
①PC部分
②Arduino部分
③電子回路部分
に分かれているのですがまず③から説明します。
上図が簡単な回路図になります。CdSセルは秋月で買ったものです。
仕組みとしてはCdSセルの抵抗値を分圧を利用してA/Dポートで読んでいるという大変シンプルなものですが複数のCdSセルを一つのポートで読むための工夫が施してあります。
それを説明するためにまずはArduino のソースを貼ります。
Arduino
===============================
int cds0,cds1,cds2,cds3,cds4,cds5;
int getCdS(int i){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(i+2,HIGH);
delay(5);
return map(analogRead(0),0,1023,0,255);
}
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
if(Serial.available()>0){
Serial.print(getCdS(0),BYTE);
Serial.print(getCdS(1),BYTE);
Serial.print(getCdS(2),BYTE);
Serial.print(getCdS(3),BYTE);
Serial.print(getCdS(4),BYTE);
Serial.print(getCdS(5),BYTE);
}
delay(5);
}
===============================getCdS()関数を見てもらえばわかるように各I/Oポートの出力は読みたいCdSセルに対応するポートだけHighをそれ以外はLowを指定しています。こうすることによってダイオードが絶縁してくれるおかげで読みたいCdSセルの値だけを読むことができるのです。
なおこの方法については @chibiegg 氏に教わりましたのでこの場を借りて感謝m(__)m
次にArduinoからPCへの通信ですが、通信方式にはSerial通信を使います。
通信アルゴリズムに関してはこのサイトを大いに参考にさせてもらいましたので詳しいことはそこで見てもらうことにしてここでは概説でとどめます。
そのまえにProcessing 側のソースも貼りますねv
Processingソース
===============================
import processing.serial.*;
Serial myPort;
int cds0,cds1,cds2,cds3,cds4,cds5;
void setup(){
size(740,300);
myPort=new Serial(this,"/dev/cu.usbmodem411",9600);
fill(200,100,100,200);
}
void draw(){
background(100);
rect(20,290,100,-cds0);
rect(140,290,100,-cds1);
rect(260,290,100,-cds2);
rect(380,290,100,-cds3);
rect(500,290,100,-cds4);
rect(620,290,100,-cds5);
}
void serialEvent(Serial p){
if(myPort.available()>5){
cds0 = myPort.read();
cds1 = myPort.read();
cds2 = myPort.read();
cds3 = myPort.read();
cds4 = myPort.read();
cds5 = myPort.read();
myPort.write(255);
}
}
void mousePressed(){
myPort.clear();
myPort.write(255);
}
===============================まず画面をクリックすることでProcessing からArduino に0xFF が送られそれによって available()関数の値が0より大きくなるのでArduino 側はCdSセルの情報を測ってProcessing に送ります。 available()関数は今何バイト送られてきてるかを返すのでこれを使ってArduino からProcessing に5個以上送られてきたらその値を読み取って再びProcessing からArduino にデータを送れと0xFF を送ります。
まぁそんな感じで動いてるわけです!
Processing のコードの解説はしませんでしたが興味がある人は勉強してみてください。
なれた人ならこの描画ができるまでに30分もかかりませんw
この記事へのトラックバック
トラックバックURL
この記事へのコメント