まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

ArduinoにLEDとスイッチをつなぐ

Arduino Unoを使ってLEDを光らせてみた。それだけではちょっと足りないのでボタンも付けた。

必要な部品:
Arduino Uno ×1
ブレッドボード ×1
ブレッドボード用の線材
LED ×4
抵抗 330Ω ×4 (330Ω〜1KΩくらいでOK)
抵抗 10KΩ ×4

 今はLEDも抵抗も袋入りで買えば問題ない。
LED1
 
押しボタンスイッチはこのような形。左下の小さいのはブレッドボードに直接挿せる。
LED2
 
LEDには極性がある。リード(足)の長い方が+。電解コンデンサなど極性のある部品も+側が長い。
LED3
 
ブレッドボードに配置してみる。こんな感じでどうか。
 LED4

Arduino、というよりArduinoの心臓部であるAVRマイコンの端子は役割が決まっている。
通常のデジタル入出力と、他の機能を兼用しているものがある。
LEDの点灯にはPWM(Pulse Width Modulation)機能のある端子を使う。これは出力オン/オフの比率を切り替えることにより人間の目には輝度の変化として感じる。PWM機能のあるピンはArduinoでは基板上に#3とか~3のようにシルク印刷で指示してある。
配線のメモ。Pin3,5,6,9を出力に、Pin2,4,7,8を入力にする。
出力にLEDは直結しない方がいい。Arduinoの本などにはそのような例があるが、LEDの定格を超えるので壊す可能性がある。
入力は10KΩの抵抗を通して端子を5V側に吊るしてある(プルアップ)。プルアップ抵抗を外して実験してみたが、これがないと入力が不安定になる。
LED7

実際の配線。割と電源の配線は忘れがちなのよね。
LED5

全体。
LED6
 ではスケッチ。Arduino IDEのExamplesにある"Fade"を元に書き換える。 4LEDの明るさ制御+スイッチによる消灯。  void setup()はawkでいうとBEGIN{}に相当する箇所で、一回だけ実行される。ハードウェアの初期化に使う。 ここではpinModeで端子の入出力を設定している。  digitalReadでスイッチの状態を読み取り、analogWriteで書き込む値を0にすることにより消灯している。analogWriteはPWM制御でLEDの明るさを制御できる。
これをArduino Unoに転送して確認する。ボタンを押した位置のLEDが消灯すればOK。このプログラムはLEDとスイッチの接続テストにもなるよ。
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
int bright[4] = {0,0,0,0};
int i;

const int LED0 = 3;
const int LED1 = 5;
const int LED2 = 6;
const int LED3 = 9;
const int SW0 = 2;
const int SW1 = 4;
const int SW2 = 7;
const int SW3 = 8;

void setup()  { 
  pinMode(LED0, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(SW0, INPUT);
  pinMode(SW1, INPUT);
  pinMode(SW2, INPUT);
  pinMode(SW3, INPUT);
} 

void loop()  { 
  // set the brightness of pin 9:
  analogWrite(LED0, bright[0]);    
  analogWrite(LED1, bright[1]);    
  analogWrite(LED2, bright[2]);    
  analogWrite(LED3, bright[3]);    

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;
  for(i=0;i<=3;i++){
    bright[i] += fadeAmount;
  }
  if (digitalRead(SW0)==LOW) bright[0]=0;
  if (digitalRead(SW1)==LOW) bright[1]=0;
  if (digitalRead(SW2)==LOW) bright[2]=0;
  if (digitalRead(SW3)==LOW) bright[3]=0;

  // reverse the direction of the fading at the ends of the fade: 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  // wait for 30 milliseconds to see the dimming effect    
  delay(30);                            
}
 実は手抜きしてあるので、最初揃っていた明滅のタイミングがボタンを押すことによりずれて行ってしまうよ。

 動作中の動画はこちら。 
Arduino 4LED 4switch

 組立とプログラム(といってもサンプルを元に改造)は一時間もかからなかった。これはマイコン界の軽量言語ではないかい?手持ちのブレッドボードなどが増えればスクリプトの資産が増えるのと同様にいろんなことがさらに簡単にできそうだ。
Arduinoをはじめよう 第2版 (Make:PROJECTS)Arduinoをはじめよう 第2版 (Make:PROJECTS)
Massimo Banzi 船田 巧

オライリージャパン 2012-03-16
売り上げランキング : 2218

Amazonで詳しく見る
by G-Tools

ArduinoでFizzBuzz

Lチカはできたので今度はLCDに文字を表示してみる。

先に部品表。
Arduino Uno x1
超小型LCDキャラクタディスプレイモジュール x1
(付属:ピンヘッダー 16P x1、抵抗100Ω x1)
10KΩ半固定抵抗 x1
ブレッドボード x1
ブレッドボード用ジャンパー線
Arduinoとブレッドボードをつなぐジャンパー線(両端子がオスで、柔らかい線のもの)

Arduino Unoは千石か若松、マルツにあったはず。液晶は秋月から買うと付属品がある。予算は4000円ぐらいかな?
あと、Arduino Unoとパソコンを繋ぐUSBケーブルが必要。

 以下を参考にした。
http://arduino.cc/en/Tutorial/LiquidCrystal 

 ここで示されている実体配線図を参考にしながら、手持ちの液晶モジュールに合わせて配線する。
全体はこんな感じ。
LCD2


 20年くらい前は各社から表示は同じでもコントローラが違う液晶モジュールが出ていたが、日立のコントローラのプロトコルがデファクトスタンダードとなった。行数や桁数が違うだけで同じ。

使用した液晶モジュールは秋月電子で買った16x2(2x16)液晶モジュール。
超小型LCDキャラクタディスプレイモジュール(16×2行バックライト・オレンジ) 

液晶面、下側に端子を置き、左から14,13,12,...2,1,16,15ピンになる。
 
14 DB7 (Data Bit7)
13 DB6 (Data Bit6)
12 DB5 (Data Bit5)
11 DB4 (Data Bit4)
10 DB3 (Data Bit3)
9 DB2 (Data Bit2)
8 DB1 (Data Bit1)
7 DB0 (Data Bit0)
6 E (Enable Signal)
5 R/W (Read/Write)
4 RS (Register Select)
3 VEE (コントラスト)
2 Vdd (5V)
1 Vss (GND)
16 A (LED +4.2V)
15 K (LED -)

 これに付属のピンヘッダーをハンダ付けする。ピンヘッダーの短い方を液晶モジュールに。ハンダ付けはたったこれだけ。あ、液晶モジュールのパネルを保護するためにセロハンテープなど貼っておきましょう。ハンダのヤニが飛んでくっつくことがあります。

ArduinoのLiquidCrystalライブラリは液晶モジュールからの読み出しを行わないためR/WはGNDに落とす。また、液晶モジュールは4bitモードと8bitモードがあるが、4bitモードを使用するためDB0-DB3は使わない。
VEEに与える電圧により文字のコントラストを調整できる。ここでは10KΩの半固定抵抗に繋いでいる。
Vdd,Vssは液晶モジュールの電源。A,Kはバックパネル照明のLED用。これは秋月のモジュールに付属している100Ωの抵抗を直列に接続する。
配線は以下を参照してください。

LCD1


で、表示するだけならサンプルで確認できるので、FizzBuzzができるように改変した。
Arduino IDE 1.0でのスケッチは以下のとおり。
setup() はArduinoスタートアップ後1回だけ実行される。周辺などのイニシャライズを書く。
続けてloop()内の記述を繰り返して実行する。

※Arduino IDEにコピペするときは#includeの行を手で打ちなおしてください
// include the library code:
#include <LiquidCrystal.h>

unsigned int t;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  t=1+millis()/200;
  lcd.setCursor(0,0);
  if(t%3==0 && t%5==0) {
    lcd.print("FizzBuzz");
  } else {
    if (t%3==0) {
      lcd.print("Fizz    ");
    } else {
      if (t%5==0) {
       lcd.print("Buzz    ");
      } else {
       lcd.print("        ");
      }
    }
  } 
  lcd.setCursor(0, 1);
  lcd.print(t);
} 
動画は以下を見てね:

 さて、表示だけでは物足りないのでアナログ入力を使ってみる。
ArduinoのA-D変換入力は0~1023の値をとる。これは0~5Vの電圧に対応する。ここに10KΩの可変抵抗をつないでみよう。黒のミノムシクリップはGNDへ、赤は5Vへ、黄色はA0ポートに接続する。
LCD10

 ソースはさっきのものを元に修正。A0ポートから値0~1023を読み取り、これを元にFizzBuzz判定する。
LCD11
こんな感じでつまみを回すと液晶の下の行に1~100ぐらいが表示され、上の行にFizzBuzz判定される。

ソースはこちら:
// include the library code:
#include <LiquidCrystal.h>

unsigned int t;
int sensorPin = A0 ;
int value = 0 ;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  t=analogRead(sensorPin)/10+1; // (0...1023)/10 +1
  lcd.setCursor(0,1);lcd.print("     ");
  lcd.setCursor(0,0);
  if(t%3==0 && t%5==0) {
    lcd.print("FizzBuzz");
  } else {
    if (t%3==0) {
      lcd.print("Fizz    ");
    } else {
      if (t%5==0) {
       lcd.print("Buzz    ");
      } else {
       lcd.print("        ");
      }
    }
  } 
  lcd.setCursor(0, 1);
  lcd.print(t);
  while(millis()%1000!=0); // wait 1sec.
} 
動画は以下を見てね:
Arduino de FizzBuzz Analog in

 で、感想だがArduinoすごく簡単にいろんなことが出来る。ふつうマイコンボード買ってなんかやろうとしたら接続先のデバイス調べて制御の方針決めてプログラム書いてデバッグし……と三日から一週間コースではないか?Arduinoは本家にライブラリが充実しておりIDEからすぐ呼び出せるので悩むことがなかった。また、Webを探せば先人の苦労がたくさん見つかる。
通常組み込みマイコンの作例は一般に流通することはなかったが、使いやすいワンチップマイコンが現れ、ボード込みで安価に入手できるようになったおかげでたくさん見かけるようになった。さらにArduinoはオープンソースであり、ライブラリもそうやって開発されている。そんなわけでハンダ付け16箇所のみで手先の不器用な僕でも一時間程度で作ることが出来た。この記事をまとめるほうがよっぽど時間がかかっている。組み込みのプロトタイピングとしても有効ではないか。
 昨年発表されてまだ販売されてないArduino Leonardoは小型のボードで価格も安くなりそうで、かなり期待している。プロトタイピングの結果を焼き直して利用できそうだ。前職のデバッグ担当の頃だったら色々な治具として使ってみたかった所だ。
 などと書いたが手元でチカチカ動くのは楽しいね。ほんとに簡単だからみんなもやってみよう!

PS/2キーボード変換器の製作(8)

Arduino Unoで試作し、Davinciに実装する方針にした。
(1) PS2Keyboardライブラリでキーボードが扱えることを確認
(2)USB HID Keyboardデバイスにできることを確認
(3)US→JPのマッピングを行う(PS2Keyboard.cppの修正)
でやってみる。

資料メモ:
PIC AVR 工作室 ブログ
ARDUINO PLAYGROUND PS2Keyboard
Interfacing the PS/2 Keyboard
PS/2 Keyboard Library
Virtual USB Keyboard

(1)の注意点:プルアップ抵抗が必要
(2)の注意点:DavinciのUSBインターフェースがよくわからないのでソフトウェアによるV-USBを使う
(3)の注意点:US配列とGerman配列があるので、ここを修正

Arduinoメモ

Arduino Unoを買ったままでほったらかしてたので動作確認してみた。
 arduino本家
ここから最新のArduinoIDEをダウンロードする。
USB-Serial通信のドライバは、MacOSXの場合はFTDIのサイトからダウンロード(Getting Startにリンクあり)、Windowsの場合はダウンロードしたzipファイルの中、driversのフォルダ。

Arduino UnoにはサンプルとしてBlinkがあらかじめ書きこんであった。IDEからBlinkを開き、LEDが点滅する周期を書き換えて転送し確認する。ボード上のPort13にLEDが接続済みなので、わざわざブレッドボードなど使わなくてもOK。

 安価なArduino Davinciを持っているのだが、これはデフォルトでは選択できない。Boards.txt内でコメントアウトされているらしいので有効にする。
Windowsの場合はhardware\arduino\boards.txt。改行コードがLFなので注意。
MacOSXの場合は以下を参考にした。
TETRASTYLE-dev-BLOG
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt

追記:Arduino Davinciで動作確認。
Windows7(32bit)ではデバイスドライバを認識しなかった。Strawberry-Linuxのページを参照して.infをダウンロードしてもできず。
MacOSXではBoardをArduino Leonardに設定すればサンプルのBlinkが動いた。基板上の赤いLEDが点滅する。ただしスケッチをコンパイルしてアップロードするごとにリセットされ、モデムとして認識される。これは32U4でUSBの機能を実現しているせいかもしれない。(Arduino UnoはUSBは別チップ)


USBマイコンのメモ

USBターゲット機能を持ったマイコンのメモ。
 USBにはホストとターゲットがあるが、ターゲット(キーボードなど周辺機器)側の回路が簡単になるよう非対称になっている。ホスト機能を持ったマイコンは高価。USBターゲット機能を持ったマイコンボードを使うとデバッグなども簡単になる。

・78K0 - トラ技の付録だったボード。マルツで扱っている。
 ほぼ目的にピッタリの記事。PS/2→USB変換を行っている。
Oyayusby(FMV-KB211/611 → USB HID 変換器)
  その元、PC9801のキーボードをUSBにする記事。
PC-9801キーボード→USB 変換器 

・MSP430ランチパッド 格安の開発キット
MSP430ランチパッド
【第25回 技術 TIPS】MSP430 USB 開発パッケージ v3.0 リリース
TI LaunchPad wiki
NJC's MSP430 LaunchPad Blog

・AVR USB
LUFA Library
ダ・ヴィンチ32U with Arduino Bootloader ATMEGA32U4

PS/2キーボードのスキャンコードについて
Scan Codes Demystified
Scan Codes -- Set 2

V-USB:AVR用USBファームウェア メモ

AVRマイコン用にソフトウェアのみでUSBターゲットを実現できるV-USBというものがあるらしい。(実際は多少の周辺が必要)

V-USB A Firmware-Only USB Driver for the AVR 

Virtual USB Port for AVR

ライセンス形態としてGPL V2と商用のものがある。
AVRは外付け発振器でも内蔵でもよく、2Kのフラッシュメモリと128バイトのRAMがあればよい。

V-USB Human Interface Devices

HIDのキーボードなどは特にデバイスドライバが不要。IBMのPS/2キーボードを改造してキーマトリックスからUSBに繋げたり、1キーのみのUSBキーがあったりと作例豊富。
 
ちょっと読んでみる。 

マイコンHC08のメモ

freescaleの8bitマイコンHC08について資料のまとめ。

簡単な特徴:
 8bitでHC6805命令セット互換なので68系経験者には入りやすそう。
 I/Oにキー割込みという設定があり、エッジ/レベルの変化で割込みが掛けられる。
 CodeWarriorによる開発。

 なおHCS08はちょっと違うので注意。

・メーカーによる説明
freescale HC08
・HC08スターターボードキットver.2の開発元
マイコン工作の実験室 
・HC08スターターボードキットver.2取り扱い
 千石電商 マイコンも千石から入手可能
 ・HC08マイコンの解説書
試しながら学ぶHC08マイコン入門―ミニマイコン扇風機を題材にした電子工作とマイコン・プログラミング  
・エレキジャックの連載
エレキジャック アーカイブ

・freescaleのcodewarrior開発ツール
freescale - IDE - Debug, Compile and Build Tools 
・HC08データシート
freescale - datasheet HC08 
・MC68HC908QY{1|2|4}ACPEドキュメント[pdf]
datasheet


千石から通販で購入できるのは
MC908QY1ACPE
MC908QY2ACPE
MC908QY8CPE
の三種類。主な違いはROM/RAM容量。いずれも16pinのDIP。


PS/2キーボード変換器の製作(7)

前回の続き。

ホスト側からの送出は以下のようになる。

 ・DEVICE(キーボード、マウス)はCLKを発生させる。
・バスの制御権はHOSTにある。CLK="L"にすることにより初期化される。
・CLK、DATA線はDEVICE-HOST間でオープンコレクタで結ばれている。
 どちらかが"L"にすればすべて"L"になる。通常は"H(OPEN)"。

(1) HOST CLK="L"
(2) HOST DATA="L"
(3) HOST CLK="H(OPEN)"
(4) HOST はDEVICEがCLK="L”にするまで待つ
(5) HOST 1bit目DATA設定 CLK="H(OPEN)"にするまで保持
(6) HOST はDEVICEがCLK="L”にするまで待つ
(7) HOST 2bit目DATA設定 CLK="H(OPEN)"にするまで保持
(8) HOST はDEVICEがCLK="L”にするまで待つ
(9) HOST 3bit目DATA設定 CLK="H(OPEN)"にするまで保持
(10) HOST はDEVICEがCLK="L”にするまで待つ
(11) HOST 4bit目DATA設定 CLK="H(OPEN)"にするまで保持
(12) HOST はDEVICEがCLK="L”にするまで待つ
(13) HOST 5bit目DATA設定 CLK="H(OPEN)"にするまで保持
(14) HOST はDEVICEがCLK="L”にするまで待つ
(15) HOST 6bit目DATA設定 CLK="H(OPEN)"にするまで保持
(16) HOST はDEVICEがCLK="L”にするまで待つ
(17) HOST 7bit目DATA設定 CLK="H(OPEN)"にするまで保持
(18) HOST はDEVICEがCLK="L”にするまで待つ
(19) HOST 8bit目DATA設定 CLK="H(OPEN)"にするまで保持
(20) HOST はDEVICEがCLK="L”にするまで待つ
(21) HOST 9bit目(parity)DATA設定 CLK="H(OPEN)"にするまで保持
(22) HOST はDEVICEがCLK="L”にするまで待つ
(23) HOST DATA="H(OPEN)" ※これでHOSTからのデータ送出終わり
(24) DEVICE DATA="L",CLK "H"→"L"→"H"
(25) DEVICE CLK="H(OPEN)" 終了

DEVICE側はCLKの立ち上がりでデータを受け取ることになる。
 
 
波形を見ると4つのかたまりで観測できている。

10110111 1 0
0xED キーボードLED制御コマンド

01011111 1 0
ACK

00100000 0 1
0x04 Caps Lock ON

01011111 1 0
ACK

CAPSON_100KHz


PS/2キーボード変換器の製作(6)

ロジアナをつないでPS/2の信号を観測してみた。

詳しい仕様はPS/2 マウス/キーボード プロトコルとインターフェース で解説されている。

CLKとDATAを観測すればよい。CLKが’L'のときのDATAを読む。

SPC_100KHz

ロジアナのサンプリング周期は100KHz( 10μs)。CLKが10回変化する間に800μsかかっているので、1CLKあたり80μs。仕様によるとCLKのHまたはLの期間は30μs~50μsなので妥当。
DATAを読むと 0_10010100_0_1 となっている。最初の0はスタートビット。LSB側から8bitのデータが送出され、10bit目は奇パリティ(データとパリティビットを含む1が奇数個)。最後の11bit目はストップビットで1。
よって0x29 でこれはスペースキーのスキャンコード。

USB充電通信ケーブル

この前Android機の中をいじろうとUSBで接続したら全然認識せずに午前中を潰してしまった。よくよく調べたらなんと充電onlyケーブルのケーブルだった。紛らわしい。USBロゴ付けないで!
…ということがあったのでUSBの通信と、通信をOFFにして充電のみ出来るものはないか探してみた。
ELECOM USB2.0HUB 個別スイッチ付 セルフパワー 4ポート 2m ブラック U2H-TZS420SBKELECOM USB2.0HUB 個別スイッチ付 セルフパワー 4ポート 2m ブラック U2H-TZS420SBK

エレコム 2010-08-20
売り上げランキング : 11503

Amazonで詳しく見る
by G-Tools
 が、これは違う。スイッチを押すと電源が切れてしまう。 ということで作ってみた。

usbcable1

 ホームセンターで買ってきたコタツ用の電源スイッチと、USB延長ケーブル。
mini-Bやmicro-B、特殊なものなど各種コネクタに繋ぎたいため、それぞれの携帯電話などに付属のUSBケーブルを接続できるようにとUSB延長ケーブルにした。

usbcable2

 内部はこんな感じ。ご想像の様に+5V、GNDはそのまま。スイッチは片切りなのでD-はそのまま接続し、D+をカット出来るようにした。
 スイッチがでかく、ON/OFFはっきりわかるのでLED等もいらない。
 これで、WindowsMobileのように接続するとSync動作を始めるものでもあらかじめ通信OFFにしておけば充電のみ行うことが出来る。SyncしたければパチンとONにする。よし。
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ