まごころせいじつ堂

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

Arduino

メモ:Arduinoのtone()

 Arduino IDE 1.0.6 + Arduino Leonardo(互換機)で確認。
 昔はtoneライブラリだったのがいつのまにか内蔵のtone()関数になっていた。

http://arduino.cc/en/reference/tone

 昔はピンに制限があったような記憶。全ピンで音が出せるか以下のコードで確認。

https://gist.github.com/houmei/a81073dbe811d90c1fe4

圧電ブザーを端子に挿しながら確認する。D0〜D13、A0〜A5で音がでた。
tone(ピン,音程)でセットした後、noTone(ピン)で解除しないと別ピンでtone()が使えない。tone(ピン,音程,長さ)を設定したときも同様。

2015tonelib


次はこれを使ってみたい。

サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック
サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック
サインスマート(SainSmart)
売り上げランキング : 45127


Amazonで詳しく見る
by G-Tools

赤外線受信モジュールのばらつきと対策

 前回の実験の続き。今度はデータシートにあるノイズ対策をやってみた。ちょっと見てみよう。

2015IRtest1


 Vcc-GND間に電源安定用のコンデンサ、R2はダンピング抵抗と思われる。

ダンピング抵抗について:第6回 ダンピング抵抗の値ってどのように決めるの (elspear)

R1はプルアップ抵抗の様に見えるが
2015IRtest2

 赤外線受信モジュールの出力はこのようになっているので、内部のプルアップ抵抗にパラに22KΩをつないだようになる。赤外線受信モジュールのVcc-Vout間を測定すると25KΩ〜30KΩ台だったので、約10KΩくらいになる。V=IRなのでこの部分にノイズ源となる電流が流れるとRが大きいほどノイズとなるVも大きくなる。
デメリット:5V電源で内部30KΩとすると待機時に約0.17mA、10KΩになると0.5mA流れることになる。

コラム: インピーダンスの話(TRITECH)

こんな感じで対策回路を組み込んだ基板を作り、前回と同じ条件で実験した。
2015IRtest0



で、結果は以下のとおり。(クリックで拡大)
2015IR-receive


 対策後は認識率が上がっている。同じ種類のモジュール(秋月モールド、秋月シールド有り、ノーブランドシールド有り)それぞれ2個ずつ試したがモジュール間の差というよりは個別のばらつきが大きいように思える。そう言い切るためにはもっとたくさんの個数で調査しないといけないが手持ちはこれだけなので。
 ノイズ対策回路の効果は確認できたので、今回の用途ではその回路を組み込み、赤外線受信モジュールは選別品を使うことにする。

赤外線受信モジュールのばらつき

 赤外線リモコンの信号を受け取ることができる赤外線モジュール、試してみたら受信がうまくできるものとできないもの、ばらつきがあるように感じたので実験してみた。

 ソフトウェアはArduino用のライブラリを使用した。以下の記事を参照。ATmega32U4のArduino Leonardo系でも動く。
A Multi-Protocol Infrared Remote Library for the Arduino(Ken Shirriff's blog)

受信側環境:

MacOSX 10.10 Yosemite + Arduino IDE 1.0.6
IRrecvDemoのサンプルスケッチを使用。赤外線モジュールの信号はPin11に接続。
USB電源を本体から供給
Arduino Leonardo互換機 Seeeduino Lite

赤外線受信モジュール:
(1)赤外線リモコン受信モジュール PL-IRM2161-XD1(2個入)(秋月電子)
(2)赤外線リモコン受信モジュールOSRB38C9AA(2個入)(秋月電子)
(3)ノーブランド品
(4)GROVE - 赤外線受信器

2015IRmodule

送信側環境:
テレビ用リモコン ELPA RC-TV005ST サンヨー1241モード設定
約2m離れた距離から左手で[1]〜[12]キーを順に押す、これを10セット

室内蛍光灯を点灯した状態と消灯した状態で実験する。

リモコンのボタンを押すと対応したコードが4バイトの16進数で表示される。これを採取し、[1]〜[12]に対応するコードを正常、その他をエラーとして受信が成功する割合をだした。awkのスクリプトは以下。
https://gist.github.com/houmei/54843bfed64079e1aa92

さて、結果。-a,-bは二個同じ種類があったのでそれぞれ実験した。数値は蛍光灯下と蛍光灯を消した状態。

(1-a) 0.825175 0.726115
(1-b) 0.8125 0.77027
(2-a) 0.746575 0.538462
(2-b) 0.886364 0.789474
(3-a) 0.709924 0.754098
(3-b) 0.952381 0.902256
(4) 0.659574 0.588608

 6割を切っているものがある。"FFFFFFFF"のコードはキーが連続で押された状態。[1]〜[12]のキーを押した時には実際は連続しないのだが、これを弾くと:

(1-a) 0.991597 0.904762
(1-b) 0.983193 0.844444
(2-a) 0.908333 0.636364
(2-b) 0.991525 0.913043
(3-a) 0.781513 0.760331
(3-b) 0.991736 0.991736
(4) 0.853211 0.699248

なぜか蛍光灯を消した状態で成功率が下がっている。ひょっとしたらパソコンの液晶画面、つけっぱなしだったのでその影響か?
同じ種類でもばらつきがある。特に(2)と(3)はシールドされているタイプ。(4)は回路込みなのだが成功率が低い。

さてどうしようか。調べてみたら4.3 赤外線リモコン改善(その2)(電気電子工作の部屋)で、電源ラインにフィルタを入れたとある。今回の実験ではデータシートの推奨回路は使わず直結でやったので、次回やってみる。

GROVE - 赤外線受信器GROVE - 赤外線受信器

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

Amazonで詳しく見る
by G-Tools

メモ 赤外線受信

 Seeed StudioのGrove - Infrared Receiverの動作確認をした。動かしただけなのでメモ。

Grove - Infrared Receiver (Seeed Wiki)
ライブラリのソースはこちら。
https://github.com/Seeed-Studio/IRSendRev

サンプルのrevTestで動作確認。受光器に向けてリモコンのボタンを押すと数値がでる。

2015Ir


 以上はArduino Unoで確認したが、Arduino Leonardoではライブラリをコンパイルする時にエラーとなった。

 別のソースを試してみる。

赤外線通信の実験パート2(赤外線リモコンを送信機にして何か動かす)(きむ茶工房ガレージハウス)

こちらはスケッチのみなのでArduino Uno/Arduino Leonardoともに動いた。ただしたまに数値の受信が抜けることがあった。



ロータリーエンコーダ実験

 半年くらいまえにちょっとやってうまくいかず放置していたロータリーエンコーダの実験、うまくできたので整理。

環境:MacOSX 10.10 / Arduino IDE 1.0.6 / Seeeduino Lite(Arduino Leonardo互換)

ロータリーエンコーダはA相とB相の状態を見て回転方向を調べる。C端子はGND、AとBは10KΩでプルアップすることになっているが、ピンのプルアップ設定でよい。

2014rot1

コードは以下を参考に少し変えた。A相の変化で割り込みを使ってBの変化を読み方向を決める方式。
Leonardo系はpin2の割り込み番号がUNO系の0と違って1なので注意。

ロータリーエンコーダーを使ってみる(忘れないページ)
arduinoでロータリーエンコーダを使う (創ったり投げたり。)

https://gist.github.com/houmei/6524d5254652c7460a6e

私の環境では大量のテキストを連続してArduino IDEのシリアルモニタに送るとArduino IDEが応答なしになってしまう現象があった。なので、適当にdelay()を入れ、数値も変化した場合のみ送ることにした。
元のソースでは回転方向を'R'、'L'でいったん記録し、続くif文で++または--している。'R'を+1、'L'を-1にして続きでそのまま加算してやれば簡単になると思って改変したら'R'方向(ClockWise)の動きが渋くなってしまった。なんでプラス方向だけスッポ抜けることがあるのか不明だが調査保留とした。

追記:
Arduino IDE1.0.6の最新ファームを純正Arduino Leonardoに書き込んで実験→再現。Arduino UNOでも再現。

 さて以前やったときなぜうまくいかなかったか。ひとつはロータリーエンコーダの理解不足でカチカチと動かした時にA相B相の状態が固定になると思っていた。しかしクリックできる所で止まるとA,BともCとの接続はOFFになる。
 もうひとつはロータリーエンコーダによる端子配列の違い。

 これは上からC,B,Aの順。秋月電子のキットから流用したもの。
2014rot2

 これは上からB,C,Aの順。どこで買ったか忘れた。最近見かけるLED内蔵の透明な軸のタイプもこれ。
2014rot3

 これを間違って配線すると、片方向にしか回らないという現象が発生する。


メモ:arduino MsTimer2の上位FlexiTimer2

 arduinoでタイマ割り込みが必要な時はMsTimer2を使ってきたが、32U4を使っているArduino Leonardo系ではコンパイルできない。が、探したらあった。FlexiTimer2というのを使う。

http://playground.arduino.cc/Main/FlexiTimer2


 Teensyというのが書いてあるが、Teensy2.0は32U4を使ったボード。ということでやってみたら動いた。MsTimer2での書き方がFlexiTimer2でもそのまま使えた。

メモなんで詳細略。すまん。

aitendoのArduino互換機「びんぼうでいいの」とMacOSXでのハマりどころ(CH341Tドライバ)

2016/11/19追記:macOS Sierra用
Run Makeblock hardware (and Arduino-compatible Boards with CH340/CH341) on Mac OS Sierra
CH34x USB-UART macOS 10.12 Sierra対応ドライバ

追記:署名入りCH340ドライバがあるようだ。
Signed Mac OS Driver for Winchiphead CH340 serial bridge

 aitendoで500円のArduino互換基板「びんぼうでいいの」を買ってみた。ソケットやATmega328などの部品を余らせている人向け。
びんぼうでいいの [U3](aitendo)

 表面実装の部品はあらかじめ取り付けてある。USBのBコネクタ、28ピンICソケット、リセット用のタクトスイッチ、DCジャックをハンダ付けしArduinoのファームを書き込んだATmega328をソケットに差し込めばOK。
2014binbo1


2014binbo2

KEY_L、KEY_Hというタクトスイッチのパターンが謎だがテスタで追ったら以下のように2Pの端子に出ているだけの模様。
2014binboudeino

 基板の角はバリがあるのでやすりで削っておこう。
ATmega328の書き込みは省略して動いているArduino UNO R3から外して取り付け動作確認した。ドライバはCH341T用のものと同じ。
http://www.wch.cn/downloads.php?name=serch&page=1&keyword=ch341ser
 
Windows7(64bit)+Arduino IDE1.0.5で確認した。マイコンボードは"Arduino UNO"を選択する。

さて、ここからが問題。MacOSX用のドライバはあるのだが認識しない。ドライバはインストールできるのだが/dev/以下に現れないのでArduino IDEからも認識しようがない。USBデバイスとしては認識しているようなのだが……(MacOSX 10.9とMacOSX 10.10で確認)
CH340Tdevice


 調べたらドライバの署名がおかしくてロードされていないということらしい。

Topic: [Solved] Clone arduino Mega 2560 - no serial port DCcduino Mega 2560

対処としては
sudo nvram boot-args="kext-dev-mode=1"
としてから再起動すると署名がおかしいドライバもロードするようになり「びんぼうでいいの」も認識するようになった。ただしこれはあくまでも例外的な対処なのでドライバが更新されたらアップデートすべき。


http://www.cindori.org/enabling-trim-on-os-x-yosemite/ 

http://stackoverflow.com/questions/24986390/kext-with-invalid-signature-can-load-on-one-machine-but-not-the-other-why 

Arduino Leonardo/Micro互換のPololu A-Star 32U4 Micro

 A-Star 32U4 Microは超小型のArduino Leonardo/Micro互換マイコン。
A-Star 32U4 Micro
(スイッチサイエンス)

A-Star 32U4 Micro(Pololu)

 Arduino Microより小さい。ピンアサインはこちら。
A-Star 32U4 Micro PinAssign

 ピンの一部を出さないことでサイズを小さくしている。Digital13はLEDのみで、Analog2-5はない。32U4だと一部のDigitai端子にアナログ入力が割り当てられるので、使いたければこちらを使用するという考え。
2014pololu

これまでの選択肢としてはこういうのがあった:
Arduino Micro
Pro Micro 5V/16MHz
ダヴィンチ(ストロベリーリナックス)
32U4ブレークアウト
(スイッチサイエンス)

A-Star Programmable Controllersの仲間にはArduino Microと同じサイズのものがあり、動作電圧のバリエーションがある。

以下はA-STAR 32U4 MicroのUSB情報。

Pololu A-Star 32U4:
  製品 ID:0x2300
  製造元 ID:0x1ffb
  バージョン: 1.00
  速度:最高 12 Mb/秒
  製造元:Pololu Corporation
  場所 ID:0xfd120000 / 4
  利用可能な電流(mA):500
  必要な電流(mA):500
 


Galileo / Galileo Gen2のGPIO速度測定

 Galileo Gen2はGPIOがI2CのI/Oエクスパンダ経由からダイレクト制御に変わったということで動作速度が改善されてある。実際、キャラクタLCDはちゃんと表示された。簡単なスケッチを書いて動作速度を確認した。

 以下のスケッチでピン0〜13について0/1を繰り返し動作速度を求める。
https://gist.github.com/houmei/7a9a04c019c31098497a

Galileo 1.0.2 10000ループ
0 44534ms 4453.4us 224.5Hz
1 44684ms 4468.4us 223.8Hz
2 44514ms 4451.5us 224.6Hz
3 44947ms 4494.7us 222.5Hz
4 44785ms 4478.5us 223.3Hz
5 45071ms 4507.1us 221.9Hz
6 44928ms 4492.8us 222.6Hz
7 45096ms 4509.6us 221.7Hz
8 45207ms 4520.7us 221.2Hz
9 45225ms 4522.5us 221.1Hz
10 45298ms 4529.8us 220.8Hz
11 45265ms 4526.5us 220.9Hz
12 45097ms 4509.7us 221.7Hz
13 45188ms 4518.8us 221.3Hz

Galileo Gen2 1.0.2 100000ループ
0 222ms 2.22us 450.5KHz
1 222ms 2.22us 450.5KHz
2 222ms 2.22us 450.5KHz
3 222ms 2.22us 450.5KHz
4 257ms 2.57us 389.1KHz
5 257ms 2.57us 389.1KHz
6 257ms 2.57us 389.1KHz
7 56093ms 560.93us 1.783KHz
8 56027ms 560.27us 1.785KHz
9 257ms 2.57us 389.1KHz
10 222ms 2.22us 450.5KHz
11 257ms 2.57us 389.1KHz
12 222ms 2.22us 450.5KHz
13 257ms 2.57us 389.1KHz

Galileo Gen2はGalileoにくらべて充分高速。ピン7,8だけ極端に遅いのはここだけI/Oエキスパンダ経由になっているからと思われる。他のピンは450KHzと390KHzに分かれているがこれはなんだろう?

Galileo2届いた

 Galileo2届いた。スイッチサイエンスから購入。Galileoの時と同じくパソコンショップでも購入できるようだ。
Intel Galileo Gen 2開発ボード(スイッチサイエンス)

 GalileoとGalileo2の比較レビュー。
Arduino互換IoT向け開発ボードIntel Galileo Gen 2ってどこが変わった?(ひとりぶろぐ)

 さて、以下のドキュメントを読んで準備。
Intel Galileo Gen 2 Development Board Documents

 こちらからGalileo/Galileo2用のArduino IDE 1.5.3をダウンロード。
Software Downloads - Drivers

 MacOSXではアプリケーション以下のサブフォルダに入れたり長いファイル名では動かないことがあった。Arduino→ArduinoG513に改名して置く。
[ツール]→[マイコンボード]→[Intel Galileo 2]を選択。シリアルポートはGalileoと同じでケーブルを接続しただけではすぐには現れない。一分ほど待って選択。
[ヘルプ]→[Firmware update]で確認。現在、最新は1.0.2なのでそのまま。
 サンプルスケッチの01.Basics→BlinkでLチカ確認。USBホストコネクタ近くの緑色LEDが点滅する。

 さてGPIOの速度が気になる所だがLCDを使って確認することにした。Galileoでは表示はできるが更新が遅くとても使えない感じだった。

 LCDでFizzBuzzをやってみる。問題なく動作した。Galileoではinit.lcd(...)を追加しないと動作しないというワークアラウンドがあったが、GPIO直結のせいか必要がなくなった。
https://gist.github.com/houmei/a009ea0622b92779db7b

2014galileo2



Intel Galileo Gen 2 Disti Kit Arduino互換のインテル製開発ボード
Intel Galileo Gen 2 Disti Kit Arduino互換のインテル製開発ボード
Intel
売り上げランキング : 36854


Amazonで詳しく見る
by G-Tools
LCDシールドキット(青)
LCDシールドキット(青)
スイッチサイエンス
売り上げランキング : 80600


Amazonで詳しく見る
by G-Tools

 

Arduinoで任意のUSBコードを送る 解決編

 Arduino Leonardo/MicroはUSBキーボードとして使えるが、Usageコードが101より大きいものは無視されるという問題があった。
PS/2キーボード変換器の製作(18) USBキーボードの無視されるキーについて
対策箇所はわかっていたが、当時はバイナリにパッチするという手段しか思いつかず強引にやっていた。
PS/2キーボード変換器の製作(19) HEXファイルにパッチを当てる
 この後、Arduino IDEのフォルダ内にあるソースをいじると反映されることを知った。Arduino IDEは毎回ソースから全部ビルドしてたのか!コアな部分はコンパイル済と勝手に思っていた。
Turning an Arduino Leonardo into a joystick.(Imarginary Industries)
 この記事ではUSBAPI.h、HID.cppを修正することによりジョイスティックのUSB-HIDを追加している。ということはArduino IDEにあるHID.cppのHID Report Descripterを修正することで日本語キーボードの機種で¥マークなどを入力できるようになるはずだ。
MacOSXだと修正対象のソースはContents/Resources/Java/hardware/arduino/cores/arduino/以下にある。
https://gist.github.com/houmei/2ad9f7a713f46149e72f

HID.cppを差し替え、ライブラリを組み込む。このライブラリはHID.cpp/USBAPI.hと一体化もできると思うが以前作ったのをそのまま流用しているのでこうなっている。

2014shot1
 これはDavinciにArduino Microのファームウェアを書き込んだもの。pin4にスイッチを付けてフリスクの大きめのケースに入れてみた。たったこれだけ。日本語キーボードがついてるものがWindowsXPの古いノートPCしかなかったのでそれに接続して¥マークが入力できることを確認した。

https://gist.github.com/houmei/0ac6873618caa02f22b4

 USBキーボードのUsageコードについては以下からどうぞ。注意点としてUSキーボードのレイアウトが基準。
USB HID to PS/2 Scan Code Translation Table

 ああ、これで数年悩んでた問題が解決だ。変なバイナリパッチ作った時点で誰も突っ込んでくれないのね。


 ついでにPrint ScreenのUsageコード(0x46)を設定して最近話題のエビデンス画面スクリーンショット用ボタンにしてみた。これでハードコピー取り放題よ。
2014shot2

 

I2C接続のジョイパッド

 MICROCHIPのI/OエキスパンダMCP23008を使って簡単なジョイパッドをC基板で作ってみた。
MCP23008は8本のGPIOをI2C経由で制御できる。上位のMCP23017は16本制御できるが、ジョイパッドに必要なスイッチは上左下右ABなのでMCP23008を選択した。
 C基板のちょうど収まりのよい位置にタクトスイッチを配置してメッキ線でぜんぶ配線。上の方にI2C端子を出す。Groveの並び(SCL/SDA/Vcc/GND)に合わせる。
2014joypad1

     回路図はあとで整理するけどもほぼ見たまんま。

MCP23008
1 SCL Groveコネクタ1 SCLへ 3.3KΩプルアップ
2 SDA Groveコネクタ2 SDAへ 3.3KΩプルアップ
3 A2 Vdd
4 A1 Vdd
5 A0 Vdd
6 *RESET 10KΩプルアップ
7 NC
8 *INT NC
9 Vss
10 GP0 ジョイパッドUp
11 GP1 ジョイパッドLeft
12 GP2 ジョイパッド Down
13 GP3 ジョイパッド Right
14 GP4 ジョイパッド Trigger A
15 GP5 ジョイパッド Trigger B
16 GP6 NC
17 GP7 NC
18 Vdd

Groveコネクタ3 Vdd
Groveコネクタ4 Vss 

 マイコンボードはArduino Leonardoと互換のSeeeduino Liteを使用した。これはボード上にGrove端子(I2C,Serial)が付いていてそのまま接続できる。今回Seeeduino Lite用のドライバや定義ファイル(board.txt)は使わずにArduino Leonardoとして使っている。 

2014joypad2

   さて、I2Cの制御はどうしようかなと探していたらMCP23008用のライブラリがあった。これをArduino IDEにインストールしておく。
https://github.com/adafruit/Adafruit-MCP23008-library 

 動作テスト用のスケッチはこちら。
https://gist.github.com/houmei/4c5c3db0579f5b12a71e

 押したスイッチに対応してU L D R A B の記号が表示される。これでハードの動作確認ができた。

続きの予定:
・回路図描く
・コネクタを追加し、ATARI(MSX)仕様のジョイスティックをつないでみる。





 

メモ:Intel Galileo Gen2の話題

 Galileo Gen2が出るらしい。
IntelがIntel Galileoボード(Gen2)の概要情報を公表
(KEI SASAKI's PAGE.)
Intel Galileo Gen 2は8月に発売予定(KEI SASAKI's PAGE.)

Intel unveils second generation Galileo hacker SBC(LinuxGizmos.com)

 プロセッサはそのまま。不評だったGPIOの速度、シリアルインターフェースが改善されているようだ。
 

GPSモジュールGM318Bの確認

 aitendoでGPSモジュールGM318Bを購入。ちょっと動作確認。
 このモジュールは4800bpsで受信したデータをシリアルから送り出す。フォーマットについてはよく知らないのでこれからやる予定。今回はハードウェアの接続のみ。Groveのコネクタに合わせてシリアル通信させればよいだろう。このモジュールは3.3V動作なのでCrowduinoを3.3V設定にしSoftwareSerialを使おう。

 Grove用コネクタにこんな感じで工作した。
2014GPS1

 配線はこんな感じ。Grove用のケーブルを中央から半分にカットする。黄=TX,白=RX,赤=Vcc,黒=GNDに接続。PWR_CTRLはメッキ線でGNDに接続。

2014GPS2

 これをGroveシールドのD10/D11コネクタに接続。スケッチは以下のとおり。(SoftwareSerialExampleをちょっと変えただけ)
https://gist.github.com/houmei/5020ac8527de0fa9c26f

2014GPS3


 今気付いたがこっちのほうが値段も変わらず楽だったか?……GROVE GPS 

Adafruit 1.8" TFT Shield用ゲタ

 Adafruitの1.8" TFT Shield、SPI関係の信号線をICSP端子からではなくArduino UNOのD13、D11から取っているのでそのままではArduino LeonardoやDueで動かない。そこで端子を変換するゲタを作った。

2014tftshield1


(1)Arduinoのバニラシールドは、ICSP端子の部分が使えるものを選ぶ。秋月電子扱いのものは該当部分に穴がない。
(2)ピンヘッダのうち、D13(SCLK)、D11(MOSI)、D10(CS)はピンを曲げて下のシールドに刺さらないようにする。
(3)バニラシールド上のD13をICSP端子のSCLK、D11をMOSIに接続。D10はD9にハンダ付け。
※D10はD9とICSP端子の横にジャンパで接続が切り替えられるようにしているが、これは86DuinoのハードウェアCSに繋ごうと思ったため。
※手抜きでメッキ線の空中配線しています。


2014tftshield2


 このようにArduino DueでハードウェアによるSPIで動作。Arduino DueはSPI.setClockDivider()の指定が数値で、SPI.setClockDivider(2);とすると動作クロック÷2=42MHzとなる。しかし、Adafruit 1.8" Shieldのレベルコンバータの仕様で10MHzが上限とあった。動作クロックは観測していない。

Arduino Due Hardware SPI (The 21st Century Digital Home)

 なお、Arduino Leonardo、86Duinoでの動作も確認できた。
2014tft86duino



Arduino用バニラシールド基板ver.2(黒)Arduino用バニラシールド基板ver.2(黒)

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

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(赤)Arduino用バニラシールド基板ver.2(赤)

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

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(緑)Arduino用バニラシールド基板ver.2(緑)

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

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(青)Arduino用バニラシールド基板ver.2(青)

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

Amazonで詳しく見る
by G-Tools
Arduino用バニラシールド基板ver.2(白)Arduino用バニラシールド基板ver.2(白)

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

Amazonで詳しく見る
by G-Tools

メモ:Arduino TFTライブラリの調査 →解決 SDカードのせい

 Adafruit 1.8" TFTシールドがハングしてしまう問題、解決した。microSDカードのせいだった。

 いよいよ波形観測しないといかんかな〜と思ってて気付いた。μSDカードが繋がってる。
μSDカードを外してテストしたらハングアップしない。試しにSanDiskのμSDカードを挿したら問題なく動いている一時間程度でハング。ノーブランドのμSDカードが悪さしていたようだ。ちょっと気づくの遅かったですね。(その後、SDカードなしで12HランOK)
となると、SDカードからイメージを転送して表示するものはこのトラブルが発生する可能性がある。注意。

 あと、調査中色々検索してわかったことだが、3.3V-5VレベルシフタのCD4050、動作上限が10MHzなのであまり高いSPIクロックだと動かないということだった(Arduino UNOでは問題ない)。3.3V系でよければバイパスしてしまうという方法がある。

2014tft1





 以下は記録として残しておく。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 Arduino IDE 1.0.5から提供されたTFTライブラリだが、ランダムに線を引くのを繰り返していると画面がおかしくなり、真っ白になる。

2014softTFThang


 

Arduino IDE 1.5.6-r2 + Arduino Due /  Arduino Leonardo (TFT.h/TFT.cppにソフトSPIのパッチ)→発生
Arduino IDE 1.0.5 + Arduino UNO (ハードSPI)→発生

 これから、IDEやマイコンボードの違いは関係なく、TFTライブラリ〜TFTモジュールの問題と考えられる。

 まだ原因は分からないが再現性を高めてみた。Arduino IDE 1.0.5+Arduino UNOで調査。
 約1分で上記写真のようになるスケッチ。
https://gist.github.com/houmei/5dc5fde18425b24e53d8

 TFT.hとTFT.cppはutilityフォルダ以下にあるAdafruit_ST7735とAdafruit_GFXを呼び出している。以前はこれらのライブラリを直接使っていた。Adafruit_ST7735が直接TFT-LCDの制御を行っている。
 SPIのタイミングはどうか、とSPI.setClockDivider(SPI_CLOCK_DIV4);などと変えてみた。結果は発生する時間は伸びたが描画のコマンドを実施した回数は同じと思われた。また、線を引くコマンドの後にdelayを入れても時間が伸びるだけで現象は発生する。
 
 TFTのline()はAdafruit_GFX経由で水平ならAdafruit_ST7735のdrawFastVline()を、垂直ならdrawFastHline()を、斜めならばdrawPixel()で点を描画している。そこでdrawFastVline()を呼び出してさらに低レベルで表示を行うスケッチを書いた。
https://gist.github.com/houmei/e3ed1cb2f2a630b6089e

 drawFastVline()を8個並べたループを10000回。二周目の途中で表示が真っ白になる。プログラムの動作自体は進行しているのでTFTモジュールがコマンドを受け付けない状態になっているように思える。
なお、シリアルコンソールを開くとリセットがかかるが、これはUNOの仕様?
 drawFastVline()の回数をこれより減らすと発生する時間が伸びる。ループが5000回でも発生する時間が伸びる。発生時間は再現性があるので特定のタイミングによってTFTが反応しなくなるように思える。

 今日はここまで。

TFT LCD Library(arduino.cc)
ST7735R datasheet(PDF)
https://github.com/adafruit/Adafruit-ST7735-Library
https://github.com/adafruit/Adafruit-GFX-Library

Adafruit 1.8" TFT ShieldをLeonardoで使う(SoftSPI)

※サンプルスケッチをしばらく実行しているとハングします※
→解決 microSDカードのせい http://blog.livedoor.jp/hardyboy/archives/7270159.html

 TFTシールドの続き。Arduino UNOではそのまま動くがLeonardoでは動かない。シールドの端子がハードウェアSPIに決め打ちになっているせい。これをソフトウェアSPIでやった。

Adafruit 1.8" 18-bit Color TFT Shield w/microSD and Joystick

シールドでの端子は以下の様になっている。
#define sclk 13
#define mosi 11
#define cs   10
#define dc   8
#define rst  0
#define sd_cs 4
ジョイスティックはアナログポートA3。


さて、以下のように書くとエラーになってしまう。TFT.hとTFT.cppはAdafruit_ST7735.hを呼び出しているが、ソフトウェアSPIを呼び出す5引数の部分の記述がないから。
TFT screen = TFT(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
以下に差し替え用のTFT.hとTFT.cpp、画面に線を引くサンプルを作った。

https://gist.github.com/houmei/1ec877f60f20c9d45a6e

 ソフトによるSPIは遅そうなので描画時間を測定した。線1本を引く時間はこのような差があった。

 Arduino UNO / ハードウェアSPI 8.65ms
Arduino Leonardo / ソフトウェアSPI 39.5ms 

2014SPIline 

追記:サンプルのスケッチ、Leonardo用はSerialコンソールを開いてないと先に進みません
ー以下解決ー
追記2:Arduino IDE1.5.6-r2にてMEGA2560互換機(Sinesmart)、Arduino DueはソフトSPIにて動作。
ただし両方共しばらく経つとハングする。(Leonardoも)

 ハングするとこうなる。Arduino Leonardoで4分46秒後に発生。
 Arduino UNO / ハードウェアによるSPIでも約1分で発生し、再起動するような挙動。TFTライブラリ?
2014softTFThang
 

Adafruit 1.8" TFT Shieldを標準のライブラリで使う

 以前トライしたAdafruit 1.8" TFT Shield、Arduino1.0.5や1.5.6-r2では標準のライブラリとしてあらかじめ入っている。

前回の実験はこれ:Adafruit 1.8インチTFTシールド

Adafruit 1.8インチTFTシールド(スイッチサイエンス)
Adafruit 1.8" 18-bit Color TFT Shield w/microSD and Joystick

サンプルスケッチを開くと今後はTFT.hだけをincludeすれば良いらしい。arduino.ccでTFTライブラリの解説を見ると5個の引数もOKなのだが、やってみるとエラーとなった。
TFTLibrary > TFT

これは TFT.h が
#include "utility/Adafruit_GFX.h"
#include "utility/Adafruit_ST7735.h"
とラップしているのだが、その下で
class TFT : public Adafruit_ST7735 {
public:
  TFT(uint8_t CS, uint8_t RS, uint8_t RST);

  void begin();  
}; 
と3引数だけを宣言しているのが原因と思われる。この中に

TFT(uint8_t CS, uint8_t RS, uint8_t SID, uint8_t SCLK, uint8_t RST); 

を追加すればエラーはなくなる。

 さて、標準のライブラリで何か表示させようにもチュートリアルはTFTモジュールのブレイクアウト基板とシールドの説明が一緒になっているのでややわかりにくい。
1.8" TFT Display Breakout and Shield

シールドでの端子は以下の様になっている。
#define sclk 13
#define mosi 11
#define cs   10
#define dc   8
#define rst  0
#define sd_cs 4

ジョイスティックはアナログポートA3。

 サンプルスケッチもシールド用にはそのまま使えないので何かデモはないかと探したら、互換シールドを作っている所にあった。
Arduino Colour TFT Shield
 が、なぜかジョイスティックがアナログポートA0でポジションの設定も全然互換でないので、ちょっといじった。スイッチのポジションは面倒なので正しく合わせてありません。
https://gist.github.com/houmei/621481ad3260b088a7eb

2014TFTshield

Arduino UNO / Crowduino(5V/3.3V)で動作確認。
いきなりArduino Dueや86Duino(これにも互換ライブラリがある)でやろうとしてうまく行かなかったのでArduino UNOで実験。リファレンス用の板大事。

追記:
Arduino Dueではダメだった。ハードSPIがUNOと違う&任意端子で指定しても動かず。arduinoのフォーラムでも動作例なし。
Intel Galileoではどうかとやってみたが、TFT.hが呼び出すAVR固有のヘッダがないのでコンパイルエラー。 

メモ:20140320


OPアンプ大全 PDFダウンロード[ANALOG DEVICES]

TI LaunchPad

Arduino
Arduino UNO R3 + dfu-programmerって、みんなどうしてるの?
Arduino + USBホストシールドの実験。[robo8080のブログ]
Interfacing Arduino to USB GPRS modem[Circuits@home]

Grove RTC[seeed wiki]
DS1307 64 x 8 Serial Real-Time Clock(PDF)

Intel Galileo — I/Oエキスパンダで液晶[痛い日記]

895円の超小型Ardunoクローン DigiSparkを買った[橋本商会]
Getting Started with your Digispark
OLIMEXINO-85-ASM

VGA端子の同期信号出力タイミング規定[日曜技術者のメモ]

Fritzingでパーツ作り[DENSIKIT.COM]

PIC
INI-M4 for STM32

I2Cの接続構成とプルアップ抵抗[電子工作の実験室]


LPC810
LPC810を使っての感想他[SE組込人]
フルカラーシリアルLED簡単に制御できるコントローラ開発[SE組込人]
NXPの小ピンARMの試食[ELM]



FPGA

FPGAでコインを掘る[SandBox(旧「サザエ2号」)]
CudaMiner / sha256.cu


 

Grove 4-Digit DisplayをCrowduinoで使うためのパッチ

 Groveの4-Digit Displayを使ってみたが、Arduino互換のCrowduinoではライブラリに修正が必要だった。これについてはモヤモヤするものがあるがメモ。

Grove - 4-Digit Display 

ライブラリは以下より。
File:DigitalTube.zip

 サンプルスケッチのClockDisplayはArduino LeonardoとArduino UNO(SMD)では問題なく動作したのだが、互換品のCrowduinoでは5Vモードで最初数回コロンが点滅して停止、3V3モードでは動作するという状態だったので調べた。
 スケッチ側から停止している部分を探すとtm1637.display()〜の箇所で止まっている。この部分に対応するライブラリがなんらかの原因で止まっている。動作電圧を切り替えると動いたり止まったりするのでタイミングの問題だろうか。LEDドライバはTM1637という石で最大6桁まで制御ができるらしいのだが、データシートを見つけることができなかった。仕方がないのでライブラリ TM1637.cpp 内のCLKとDATAをピンの信号を上げ下げしている部分に適当にdelay(10);をかませてみたら5Vでも動作するようになった。
 次はこのdelay(10);を少しづつ削っていく。最終的に

void TM1637:writeByte(int8_t wr_data) 以下にある

digitalWrite(Clkpin,LOW); //wait for the ACK の次の行に

delay(1);

が必須となった。これがないとCrowduinoの5Vではハングする。確認のためまる1日走らせて止まらないことを確認。

 さて、なにがモヤモヤしているかというとこれは
// なぜか動く
行になってしまっているからだ。本来どうすべきか。
・データシートを見て該当するタイミングの箇所を確認する
・波形を観測。5Vと3V3でどのような差があるか、タイミング違反はどの箇所か
・ソース修正によりタイミング違反が解消されていることを観測
・連続ラン確認
・さらに温度を振ってより厳しい条件で確認

 なぜか動くものはなぜか止まることもあり得るのよ。

 やはりリファレンスとして純正品のボードは必要。Arduino互換品はピンが直接マイコンから接続されているので問題ないように思えるのだが、違いはあるみたいだ。

2014ledtube
記事検索
プロフィール

hardyboy

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