まごころせいじつ堂

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

Arduino

USB HID Keyboard作例メモ

メモ。 Arduino/AVRでUSBデバイス(HID Keyboard)を実現するには、32U4を使った内蔵USB I/Fで行うものと、V-USBと言ってソフト制御のみで行うものがあるらしい。

Beating Level 1-4 in Bit.Trip runner with no hands!
iPadにArduinoをつなぎ,Webブラウザ上でProcessingを使ってセンサデータを可視化
How to bulid iPad with Arduino + Processing.js
Project Log : Arduino USB


V-USB Reference Projects
おなかすいたwiki V-USB
Virtual USB Keyboard
サブキーボード

 キーボード変換I/FではPS/2入力とUSB Bポートがあればいいので、ピンはたくさんはいらない。

これ、本命っぽい
Arduino®-Leonardo USB HID Keyboard & Mouse Tutorial and Advanced Serial Port Examples
 

Newton Keyboard to USB Converter

Arduino LCD Keypad Shield

Arduino用のLCDシールドで5つのキーが付いたものがあった。

Arduino LCD KeyPad Shield (SKU: DFR0009)

 16×2のLCDに加えて5つのスイッチが付いている。これはADコンバータの入力につながっていて、押すボタンによってアナログ値を返す。ボタンを押した時の値は正確ではないので、ある範囲内で判定する。
 LCDの配線は前回のLCDシールドとは異なっているが、4bitモードで接続するので特に問題はない。


テスト用のサンプルソースはこちら
https://gist.github.com/64778cae2cc590e76747 

2012LCDkeypadshield
 
LCDキーパッド・シールド for ArduinoLCDキーパッド・シールド for Arduino

OEM
売り上げランキング : 36446

Amazonで詳しく見る
by G-Tools

Arduino:LCDシールド

前回はブレッドボード上でLCDを使ったのだが、配線がびよんびよんしたままだとよろしくないのでLCDシールドキットを購入した。スイッチサイエンス扱いだがアマゾンからも購入できる。1980円。

2012LCD01


 早速作ってみた。スイッチサイエンスのサイトに丁寧な作り方があるので参考になる。なおキットには説明書はありませんが、元々はPrototyping Lab ―「作りながら考える」ためのArduino実践レシピ (Make:PROJECTS)という書籍で使うキットらしいです(この本知らなかった)。

2012LCD02

 ハンダ付けは30分ぐらいで完了。これをArduino UNO R3に取り付けて確認。ピン配置は偶然にも前回ArduinoでFizzBuzzやった時と同じ配線だったのでそのまま実行できた。

2012LCD03


2012lcdshield
 

LCDシールドキット(青)LCDシールドキット(青)

スイッチサイエンス
売り上げランキング : 8129

Amazonで詳しく見る
by G-Tools

こういうのもあった。
LCDキーパッド・シールド for ArduinoLCDキーパッド・シールド for Arduino

OEM
売り上げランキング :

Amazonで詳しく見る
by G-Tools

Arduino USB関連メモ

ArduinoのUSBホストシールド、USBライブラリ、ATmega32U4などのメモ。

Lightweight USB library Framework for USB-SVR Series
lufa-lib 
ドキュメント(120219版)
LUFA Library 120219 

Alternative USB AVR Stacks

Arduino UNOのUSB-シリアルI/Fに使われているATmega8U4をいじる
Arduino サブキーボード 

Arduino Hacking / Building Arduino Atmega8u2 firmware on Linux

Arduino HIDに関するもの

Updating the Atmega8U2 on an Uno or Mega2560 using DFU

Adafruit 32U4のLeonardo化 

Looking for CDC and HID Keyboard Example for ATmega32u4

USBホストシールド
USB Host Shield (HID キーボード篇)

Arduino PS/2キーボード関連メモ

PS/2 Keyboard or Mouse
Arduino PLAYGROUND: PS/2 Keyboard Ext2

ArduinoにPS/2日本語キーボードをつなぐ(カナ対応)

ArduinoにPS/2日本語キーボードをつなぐの続き。

 PS2Keyboardライブラリの国際化対応はドイツ語キーボードの記号入力を右Alt併用でできるようにしてあるので、この部分をカナに置き換えた。また、右Alt+SHIFTで拗音など入れられるように書き換えた。

カナ対応のライブラリはこちら。
https://gist.github.com/2356812 

サンプルのスケッチはPS2Simple_test_lcd.inoで、オリジナルのPS2Simple_testにLCD出力を追加している。キーボードから入力した1文字をLCDの左上に表示する。

□PS2Keyboardの修正方針
・通常入力とSHIFT併用入力でUSキー配列と異なる記号を置き換え。右Alt併用でカナ、右Alt+SHIFTでカナシフト入力。
・カナのコードは半角カナをそのまま出力。(utf8でない)
 →半角カナのコードとLCDのカタカナ表示コードが一致するので都合がよい。
  →通常のカナ(かな)のコードだと変換する関数が必要になるため。
 →オリジナルのソースはutf8対応で、0xc0より上の値をunicode変換している箇所があるのでコメントアウト
 ※0x7eはチルダ'~'だが、LCDでは'→'。しかしここだけ。
 
 あとは自由に修正して使ってみてください。いちばん面倒なカナとコードの対応部分は作りましたので:)

ArduinoにPS/2日本語キーボードをつなぐ

ArduinoにはPS/2キーボードを接続するライブラリがオプションであるので実験してみた。

 まずPS/2キーボードを接続するための治具。以前PS/2信号の観測用に作ったものを手直し。

PS2jig2

Pin1(DATA)とPin5(CLK)について、10KΩでPin4(+5V)にプルアップ。ジャンパで設定可能。

PS2jig0

ピンの番号は写真の通り。

PIN1→Arduino Pin2、PIN3→GND、PIN4→5V、PIN5→Arduino Pin3 に接続。

なお、キーボードのCLKを割り込みとして受け付けて処理するので、Arduino UNOの場合はPin3にしか接続できない。

 ではPS/2キーボードのライブラリを設定してみる。Arduino IDEには標準では入っていないので自分で入れる必要がある。
 ARDUINO PLAYGROUND - PS2Keyboard
ここを辿っていくと
PJRC Teensy PS2Keyboard Library
があるので、ここのPS2Keyboard.zip (ver2.3)をダウンロード。

展開すると以下のような構成になっている。
PS2Keyboard¥
keywords.txt
PS2Keyboard.cpp
PS2Keyboard.h
  examples¥
  international¥international.pde
  Simple_test¥Simple_test.pde

このPS2KeyboardフォルダをそのままArduino IDEのlibrariesフォルダの下にコピーする。
Arduino IDEを立ち上げ、Simple_test.pdeを読み込む。

以下、スケッチを修正。
const int DataPin = 2;
const int IRQpin =3; 

ビルドして転送が完了すると、キーボードの入力をターミナルに表示する。Arduino IDEのターミナルはウィンドウ右上の虫眼鏡みたいなアイコンをクリックすると出てくる。
シリアル通信を使っていると、USBケーブルを外したりするとArduino IDEからCOMポートが見えなくなってしまうらしい。この様な場合はWindowsを再起動して対処した。 

 さて、これで確認できるのはUSキーボード配列だが、ライブラリを見てみたら日本語キーボードにも簡単に対応させることができそうだ。すでにドイツ語キーボードの対応が入っているので、ここを参考にすればいけそうな感じ。

 で、作ってみた。PS2Keyboard.cppとPS2Keyboard.hを以下と差し替える。
https://gist.github.com/2334909

使い方はスケッチ内で以下のようにする。
keyboard.begin(DataPin, IRQpin, PS2Keymap_Japanese);

 これでPS/2キーボードが使えるようになった。ただしPS/2テンキーのみの製品は正しいコードが反映されなかったり、応答しなかったりしたので後で調査する。
 ドイツ語配列を元に修正しているので、Altキー修飾はそのままでサボっている。気が向いたらカナにも対応したい。

チェックに使用したキーボード:
USキーボード Microsoft Natural Keyboard Elite
日本語キーボード SANWA SKB-108L 日本語108キーボード
PS/2テンキー IBM KeyPadIII P/N 79F6401 ×応答せず 、FUJITSU FMV-NTKB1 テンキーボード ×コード化け
 

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は小型のボードで価格も安くなりそうで、かなり期待している。プロトタイピングの結果を焼き直して利用できそうだ。前職のデバッグ担当の頃だったら色々な治具として使ってみたかった所だ。
 などと書いたが手元でチカチカ動くのは楽しいね。ほんとに簡単だからみんなもやってみよう!

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は別チップ)


記事検索
プロフィール

hardyboy

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