忍者ブログ

研究の掃溜ノオト

since 2011/2/13 知能ロボ研究の合間に思ったこととか書いてます。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ArduinoとProcessingを用いてCdSセルからの情報をPCに表示する

 というわけで今回は電子回路とPCをつなげることに挑戦してみましたー!
ちょうど手元にCdSセルが余っていたのでArduino UNOを使ってなにか作れないかなーと。
しかしもともとPC側はPython で実装しようとしていたのですがpyGame が謎のエラーをだして使えなくなってしまい急遽Processing を用いて実装することにしました。
Processing を使ったのは今回が初めてなんですが、グラフィックに関してとてもとてもとおおおおっても使いやすい言語なのでこれからも重宝しそうです!

さて仕組みとしては
①PC部分
②Arduino部分
③電子回路部分
に分かれているのですがまず③から説明します。
615974d3.png

上図が簡単な回路図になります。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

PR

この記事へのコメント

Vodafone絵文字 i-mode絵文字 Ezweb絵文字
管理人のみ閲覧できます
 

この記事へのトラックバック

トラックバックURL

プロフィール

HN: 相馬 豊
所属:KU
連絡先(Twitter): @i-horse
インタビューはこちら

カレンダー

09 2017/10 11
S M T W T F S
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

Twitter

アンケート

マクロミルへ登録

Google Adsence

アクセス解析

リンク

Copyright ©  -- 研究の掃溜ノオト --  All Rights Reserved

Design by CriCri / Photo by momo111 / powered by NINJA TOOLS / 忍者ブログ / [PR]