情報処理演習II
本日の講義内容
• Processingのダウンロード • プルアップ抵抗,プルダウン抵抗,内部プルアップ抵抗の利用 • 演習1: シリアル通信で学籍と名前を送信 • 演習2: シリアル通信による氏名の送信と受信 • 演習3: シリアル通信による氏名の送信と記録 • 演習4: シリアル通信による記録した氏名の表示 • ProcessingとArduinoの連携 • 演習5 : PCのウィンドウ上をマウスクリック時にLEDを点灯させよ • 演習6 –加速度センサの値を加速度への変換し、PCで表示 • 加速度センサの特性と仕様 • 演習7: 加速度センサのX軸の値でPC上に円を描画せよ • 課題Processing
のダウンロード
• Processing
をダウンロード
–http://processing.org/
プルアップ抵抗・プルダウン抵抗
•
マイコンの入力にHIGHかLOW信号を確実に伝える為に
取り付ける
•
抵抗がない場合はHIGH/LOWの状態が不安定となる
–HIGHなのにLOWとなったり、LOWなのにHIGHとなったりして マイコンが誤動作を起こす プルアップ抵抗 プルダウン抵抗Aruduino
でのプルアップ抵抗
•
プルアップ抵抗を有効にする
–pinMode(SW, INPUT_PULLUP);•
次でも同様の効果
–pinMode(SW, INPUT); –digitalWrite(SW, HIGH);プルアップ・プルダウン抵抗の使用
const int SW = 8; const int LED = 13; int state = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW , INPUT); } void loop() { state = digitalRead(SW); if (state == HIGH) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
内部プルアップ抵抗の使用
const int SW = 7; const int LED = 13; int state = 0; void setup() { pinMode(LED, OUTPUT); pinMode(SW, INPUT); digitalWrite(SW, INPUT_PULLUP); } void loop() { state = digitalRead(SW); if (state == HIGH) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
演習1: シリアル通信で学籍と名前を送信
char ID[] = "b1013000¥n"; //自分の学籍番号に変更 char NAME[] = "Sato Ikuma¥n"; //自分の氏名に変更 void setup() { Serial.begin(9600); } void loop() { Serial.print(ID); Serial.print(NAME); delay(1000); }
演習2: シリアル通信による氏名の送信と受信
• @b103000 IkumaSato.? をシリアルモニタから送信し, b103000 IkumaSato¥n¥0がarduinoから送信されシリアルモニタに表示 char NAME[256]; int rx,i = 0; void setup() { Serial.begin(9600); } void loop() { rx = Serial.read(); if(rx != -1){ //受信データが有の場合 if(rx == '?'){ //送信指令を受信した場合 Serial.print(NAME); //配列(氏名)を送信 } else{ if(rx == '@'){ //スタートマークを受信した場合 i = 0; } else if(rx == '.'){ NAME[i++] = '¥n'; NAME[i++] = '¥0'; } else{ NAME[i++] = rx; } } } }演習3: シリアル通信による氏名の送信と記録
• @b103000 IkumaSato.をシリアルモニタから送信し, b103000 IkumaSato¥n¥0がarduinoに記録 #include <EEPROM.h> char NAME[256]; int rx,i = 0; void setup() { Serial.begin(9600); } void loop() { rx = Serial.read(); if(rx != -1){ //受信データが有の場合 if(rx == '@'){ //スタートマークを受信した場合 i = 0; } else if(rx == '.'){ EEPROM.write(i++, '¥n'); EEPROM.write(i++, '¥0'); } else{ EEPROM.write(i++, rx); } } }演習4: シリアル通信による記録した氏名の表示
• Arduinoに記録したb103000 IkumaSato¥n¥0をシリアルモニタで表示 #include <EEPROM.h> char NAME[256]; int rx,i = 0; void setup() { Serial.begin(9600); } void loop() { NAME[i] = EEPROM.read(i); if(NAME[i] == '¥0'){ Serial.print(NAME); i = 0; } i++; delay(100); }Processing
の特徴(1)
• Arduino
の開発環境のベース
•
見た目も似てる
• MIT
を中心に開発
• 2002
~開発開始
• 2005
~ベータ版公開
• 2008
~正式版公開
• Java
をベースに遥かに
単純化
•
非プログラマでもOK
Processing
の特徴(2)
•
インタラクティブなグラフィックス/アニメーションを簡単に実現
Processing
のソースコード
void setup(){
size (480, 240);
}
void draw(){
if(mousePressed){
fill(0);
}
else{
fill(255);
}
ellipse(mouseX, mouseY,80, 80);
}
Processing
とArduinoを連携
•
シリアル通信を利用
–PCアプリ→Arduino • マウスクリックでLED点灯 –Aruduino→PCアプリ • センサで画面に描画⇒
⇒
演習5: PCのウィンドウ上をマウスクリック時にLEDを点灯させよ
•
ウィンドウ上でマウスをクリックするとLEDが点灯
–マウスのX座標によってLEDの明るさが変化 –13番にLEDのアノード (A) • 長い足 –隣のGNDにカソード (K) • 短い足ソースコード(
Arduino
)
const int LED = 13;
int value = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available()>0){
value = Serial.read();
analogWrite(LED, value );
}
}
ソースコード(
Processing
)
import processing.serial.*;
Serial myPort;
void setup(){
size(256,256);
myPort=new Serial(this, “
COM1
”,9600);
}
void draw(){
background(255);
}
void mousePressed(){
myPort.write(mouseX);
}
void mouseReleased(){
myPort.write(0);
}
環境により名前が 変わるので注意 Arduino->Tool->Portで確認演習6: 加速度センサの値を加速度への変換し、PCへ表示
•
以下の通りに設置せよ
–ピンアサインと向きに注意すること –間違えるとセンサが壊れるので注意すること 加速度センサの ピン番号 機能 マイコンボードの ピン番号 1 電源 5V 2 パワーシャットダウン 5V 3 GND GND 4 パリティ N.C. 5 セルフテスト GND 6 X軸出力 A2 7 Y軸出力 A1 8 Z軸出力 A0 1 4 5 83
軸加速度センサモジュール
•
振動,慣性力,重力加速度
(地軸に対する傾き)などを検出
–配ったものは秋月電子 KXM52-1050 • 測定レンジ: ±2G • 電源が5V時は 2.5Vが0G+X
+Y
+Z
+X
+Y
+Z
加速度センサの仕様
x = y - 2.5
3
軸加速度センサの値を表示
const int ACCX = A2;const int ACCY = A1; const int ACCZ = A0;
int value = 0; void setup() { Serial.begin(9600); } void loop() { value = analogRead(ACCX ); Serial.print(value); Serial.print(“,”); value = analogRead(ACCY ); Serial.print(value); Serial.print(“,”); value = analogRead(ACCZ ); Serial.println(value); delay(100); }
3
軸加速度を表示
const int ACCX = A2; const int ACCY = A1; const int ACCZ = A0; int value = 0; float ACC = 0.0; float offset= 2.5; void setup() { Serial.begin(9600); } void loop() { value = analogRead(ACCX);
ACC = value * 0.005 - offset;
Serial.print(ACC); Serial.print(",");
value = analogRead(ACCY);
ACC = value * 0.005 - offset;
Serial.print(ACC); Serial.print(",");
value = analogRead(ACCZ);
ACC = value * 0.005 - offset;
Serial.println(ACC); delay(100);
演習7: 加速度センサのX軸の値でPC上に描画せよ
•
以下の通りに設置せよ
–ピンアサインと向きに注意すること –間違えるとセンサが壊れるので注意すること 加速度センサの ピン番号 機能 マイコンボードの ピン番号 1 電源 5V 2 パワーシャットダウン 5V 3 GND GND 4 パリティ N.C. 5 セルフテスト GND 6 X軸出力 A2 7 Y軸出力 A1 8 Z軸出力 A0 1 4 5 8ソースコード(
Arduino
)
const int ACCX = A2; int value = 0; void setup() { Serial.begin(9600); } void loop() { value = analogRead(ACCX); value = map(value, 0, 1023, 0, 255 ); Serial.write(value); delay(100); }
ソースコード(
Processing
)
import processing.serial.*; Serial myPort; int x = 0; void setup(){ size(256,256);myPort=new Serial(this, “COM11”,9600); } void draw(){ background(255); ellipse(x,100,50,50); } void serialEvent(Serial p){ x = myPort.read(); }
ソースコード(
Arduino
)
通信同期機能実装(ウインドウをクリックで開始)
const int ACCX = A2;int value = 0; void setup() { Serial.begin(9600); } void loop() { value = analogRead(ACCX); value = map(value, 0, 1023, 0, 255 ); if(Serial.available()>0) { Serial.read(); Serial.write(value); } delay(100); }
ソースコード(
Processing
)
通信同期機能実装(ウインドウをクリックで開始)
import processing.serial.*; Serial myPort; int x = 0; void setup(){ size(256,256); myPort=new Serial(this, “COM11”,9600); } void draw(){ background(255); ellipse(x,100,50,50); } void serialEvent(Serial p){ if(myPort.available()>0) { x = myPort.read(); myPort.write(255); } } void mousePressed(){ myPort.write(mouseX); }
関数リファレンス(1)
• map(value, fromLow, fromHigh, toLow, toHigh)
–数値をある範囲から別の範囲に変換 • [パラメータ] – value: 変換したい数値 – fromLow:現在の範囲の下限 – fromHigh:現在の範囲の上限 – toLow: 変換後の範囲の下限 – toHigh: 変換後の範囲の上限 • [戻り値] – 変換後の数値