goo blog サービス終了のお知らせ 

-・-・ --・-  -・-・ --・-  -・-・ --・- 

不定期更新。電子工作オタクのメモなので、おもしろくないですよ。

BeagleBone IO CAPE修正版

2012-07-24 08:13:37 | BeagleBone
BeagleBone IO CAPEの修正版の回路図、パターン図が一応できた。
今回の基板は前回失敗したSD1602のピンアサイン修正と、5V電源のSD1602と3.3VのBeagleBoneのGPIOのレベルシフタとして、TC74LVXC3245FSに変更した。
このレベルシフタのデータシートには、例によって「使用していない入力は、バス入力も含めてVCC、もしくはGND に接続してください。」とあるが、今回はDIR端子にGPIOを接続して、入力と出力切り替えることができようにしているので、「ファンクションによりバス端子の入出力が切り替る場合、バス入力およびバス出力共にVCC もしくはGND に接続してください。この場合、出力が短絡されない様にご注意ください。」のとおり、未使用端子を両端で20kでプルアップした。
今回は失敗は許されないので、できれば発注する前に基板加工機で削って試してみたい。


BeagleBoneでアナログ入力

2012-07-16 08:52:08 | BeagleBone
BeagleBone demo filesの手順どおりに、新規の8GBのSDカードに書き込んでOSのバージョンアップができた。
同時にCloud9のバージョンアップもできていて、IDEの画面も若干変更になったが、アナログ入力もできるようになった。
BeagleBoneのマニュアルには、アナログ入力は絶対に1.8Vは超えるなとあるが、入力種別については書いていない。
とりあえず、単三電池1個ならマイナスにならないし、1.8Vは超えないので、20Kの半固定ボリュームのセンターからAIN0の端子に接続して、以下のコードでLCDに電圧表示ができるようになった。
テスターとは1mVの位の誤差はあるが、どちらにも誤差があるので、これでOKだろう。

習うよりは慣れろで、Cloud9環境でのプログラミング作法もだいぶ分かってきた。
Cloud9環境では、javascriptコードでの記述になるが、いろいろ調べると数値から文字列への変換方法がいくつかあるようで、当然のことだが、どれを使っても表示はOKであった。
処理速度を考えないと、記述上ではtoString()が好み。

以下は、アナログ入力の部分。
var value = analogRead(inputPin);
var raw = parseFloat(value);
console.log("raw " + value);
var v = (raw)* 1.8;

console.log("actual voltage " + v);
// v = "" + v;
// v = String(v);
v = v.toString();
v = v.substr(0, 5);
lcdStrWrite(v + " V", 0);

コマンドラインからのjavascript起動でも、Cloud9のRunボタンど同様に動く。

BeagleboneにキャラクタLCDをつなぐ

2012-07-14 07:15:15 | BeagleBone
I/O CAPEでのLCD接続は失敗したが、ブレッドボード上では正常に動作した。

何度も使ってきたLCDだが、初期化処理をネットに載っているままに使ったため、display offと設定しているのに気付かず、まともに表示できるまで、やたら時間がかかってしまった。
最初はcloud9環境でやっていたが、各ピンには正常に出力が出るものの動かなかった。
しかたないので、HD44780用の公開されているCのプログラムを試したが、ビルドはエラーなく通るものの、実行時にエラーが発生して動かない。
再度cloud9にもどったが、プログラミングの作法も良く分からないし、デバッグのやり方もわからない。
ここのコードを参考にして、キャラクタLCDのコードを書いた。
これからアナログ入力値をLCDに表示させる予定だが、その前にアナログ入力するためにcloud9のupdateが必要だ。やり方が今いちわかんねぇ。

以下、blinkled.js(名前を変えるにはプロジェクトを変更しないとダメなのかな)
var bb = require('./bonescript');
var lcd = require('./HD44780.js');

PIN_LED = exports.PIN_LED = bone.USR3;

//PIN_DIR = exports.PIN_DIR = bone.P8_41;

PIN_RS = exports.PIN_RS = bone.P8_42;
//PIN_RW = exports.PIN_RW = bone.P8_39;
PIN_E = exports.PIN_E = bone.P8_40;

PIN_DB4 = exports.PIN_DB4 = bone.P8_45;
PIN_DB5 = exports.PIN_DB5 = bone.P8_46;
PIN_DB6 = exports.PIN_DB6 = bone.P8_43;
PIN_DB7 = exports.PIN_DB7 = bone.P8_44;

setup = function()
{
lcdSetup();
lcdInit();
};

loop = function()
{
digitalWrite(PIN_LED, HIGH);
lcdClear();
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1);

lcdStrWrite("Hello World!!", 0);
lcdStrWrite("mediware", 1);
delay(1000);
};

bb.run();

以下、HD44780.js
var bb = require('./bonescript');

lcdSetup = exports.lcdSetup = function()
{
// pinMode(PIN_DIR, OUTPUT);
pinMode(PIN_RS, OUTPUT);
// pinMode(PIN_RW, OUTPUT);
pinMode(PIN_E, OUTPUT);
pinMode(PIN_DB4, OUTPUT);
pinMode(PIN_DB5, OUTPUT);
pinMode(PIN_DB6, OUTPUT);
pinMode(PIN_DB7, OUTPUT);

pinMode(PIN_LED, OUTPUT);

// digitalWrite(PIN_DIR, HIGH);
// digitalWrite(PIN_RW, LOW);
digitalWrite(PIN_E, LOW);
};

lcdNibbleWrite= exports.lcdNibbleWrite = function(val)
{
var i;
var bit;

for (i = 0; i < 4; i++)
{
bit = val & (1 << i);
switch (i)
{
case 0:
digitalWrite(PIN_DB4, bit);
break;
case 1:
digitalWrite(PIN_DB5, bit);
break;
case 2:
digitalWrite(PIN_DB6, bit);
break;
case 3:
digitalWrite(PIN_DB7, bit);
pin_eStrobe();
break;
}
}
};

lcdByteWrite = exports.lcdByteWrite = function(val)
{
lcdNibbleWrite((val >> 4) & 0x0f);
lcdNibbleWrite(val & 0x0f);
};

cmdNibbleWrite = exports.cmdNibbleWrite = function(val)
{
digitalWrite(PIN_RS, LOW);
lcdNibbleWrite(val);
};

cmdByteWrite = exports.cmdByteWrite = function(val)
{
digitalWrite(PIN_RS, LOW);
lcdByteWrite(val);
};

dataByteWrite = exports.dataByteWrite = function(val)
{
digitalWrite(PIN_RS, HIGH);
lcdByteWrite(val);
};

lcdStrWrite = exports.lcdStrWrite = function(string, row)
{
var i;

if (row === 0)
cmdByteWrite(0x80);
else
cmdByteWrite(0xc0);

for (i = 0; i < string.length; i++)
dataByteWrite(string.charCodeAt(i));
};

lcdInit = exports.lcdInit = function()
{
cmdNibbleWrite(0x3);
delay(5);
cmdNibbleWrite(0x3);
delay(1);
cmdNibbleWrite(0x3);
delay(1);
cmdNibbleWrite(0x2);
delay(1);
cmdByteWrite(0x28);
delay(1);
cmdByteWrite(0x0f);
delay(1);
cmdByteWrite(0x01);
delay(2);
cmdByteWrite(0x06);
delay(1);
};

pin_eStrobe = exports.pin_eStrobe = function()
{
// delay(1);
digitalWrite(PIN_E, HIGH);
// delay(1);
digitalWrite(PIN_E, LOW);
// delay(1);
};

lcdClear = exports.lcdClear = function()
{
digitalWrite(PIN_RS, LOW);
// delay(1);
cmdByteWrite(0x01);
};

【追記】プログラムをpreタグとcodeタグで囲んで置くも、まともに表示できなかった。
ということで、上記プログラムをコピペしても動きません。


大失敗!!

2012-07-13 23:24:31 | BeagleBone
しばらく前にBeagleBoneのI/O CAPE基板は完成したが、とんでもない失敗をやってしまった。
(失敗1)LCDのピンアサイン間違い。
部品を作った時にパターンとピン番号は合っていたが、ピンとシンボルの接続がデタラメであった。
モノクロのLCDに一瞬、しみが広がったように見えたが、触ると熱かった。トホホ。

(失敗2)3.3V<->5V変換ICの選定ミス。
秋月のLCDが5V仕様なので、TXB0108という信号方向を自動で選択してくれるというレベル変換ICを使ったが、5Vの出力が出ず、3V程度しか出力されなかった。
LCDとCPU間のレベル変換で使っている回路図を見たので、大丈夫と思ったが、けっこうトラブル事例も多いようだ。
それとも、LCDを接続した状態なら、5V出るんだろうか。

【教訓】
簡単な回路でも、ブレッドボードで試しておくべきだった。





BeagleBoneへ寄り道

2012-05-01 12:43:19 | BeagleBone
ここ2カ月ばかり、公私ともに忙しくてsmartSDRから遠ざかってしまった。
それでも、オタクのはしくれとしては、何かしらやっていないと落ち着かず、知人から預かったBeagleBoneに載っける基板を描いていた。
BeagleBoneでAndroidを動かすための開発環境の構築に手間取ってはいるが、smartSDRの方にも時間が取れそうになってきた。

BeagleBone本体

I/O CAPE(BeagleBoneではdaughter boardのことをCAPEと呼ぶらしい)