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

もんく [とある南端港街の住人になった人]

スペインかポルトガルの港町に住みたい
日本→インドネシア→台湾→マレーシア→日本
since Oct. 2004

チーチ3号改造計画 その10 (アセンブリ編1)

2016-07-23 23:58:58 | ABCのAはArduinoのA
とうとうチーチ3号もアセンブリ工程に差し掛かる。

当初、アゴの中に入れようと思っていたWTV020SDオーディオモジュールは
nanoの下のところに取り付ける事になった。

アゴの中だと収まりが悪かったから。


さて、動作確認だけれども、LEDの光らせ方をノックセンサーからの割込みで変えるわけだけれど、
やってみると全然ダメ。
7月9日の時にスケッチだけ書いておいてテストするの忘れてた。
絶対上手くいくと信じてたから。

が、ダメだ。
あれっ、センサー壊れたか?、と思った。
なぜかと言うと、テスター当てながらノックしても反応無し。

なので、もう1個買ってあったのに交換。
結果、…全く変わらない。
わからん。

確か、Vccと出力を反対につないでいた人がいたなと思い出しやってみる。
関係ない。
わからん。

と、よく考えてみるとこのセンサー、テスターでは反応しない位に素早くON-OFFが変化するのでは?
だってセンサー本体の中身はバネだ。
って事は、センサーじゃなくてスケッチの問題か?

ノックセンサーは5VがGNDに落ちるスイッチみたいなものだから
いくら初心者のプログラミングとは言え間違いようがないはず。
とすると、割込みのところじゃないか?


検索していくら調べても間違ってない。
なぜだ?

いくら考えてもわからないので近所のAEONに歩いて行って何か食べて気分転換する事にした。
ゲートを出て、道路を渡って駐車場に入る。
何だかいつもより車が少ない。
ハリラヤが終わって週末はみんなオープンハウスで友達の家廻りでもしてるのか?

そんな事どうでも良い。
フードコートに行くが、その手前のAEONの寿司と弁当売り場が今日は早い時刻から3割引だ。
チキンカレー弁当、RM4.7が3割引いて…RM3.29って事は、何と87円ほどじゃないか!
と、フードコートに行く前にメニュー、決まる。

まあ、街の食堂で食べるほど美味いわけじゃないのだけど、安いから許す。
せっかく来たのでAEONのパン屋の安売りドーナツも1個食べる。
食べながらどうにも気になるのでiPadで割込みのところ検索。
検索、検索、ケンサク、ケンサク、健作……とりゃ〜!

おっ………

ネットに上がってるスケッチを観察すると、変な事がわかった。
attachInterrupt( 0 ←ここがどのスケッチでも"0"になっている。

おかしいだろ!
Unoでもnanoでも割込みに使えるピンは2番と3番と書いてるのに!


……そうか、このゼロは、プロセッサ本体のピン番号だ!
でも、変だ。他のところはArduinoのピン番号なのに割込みだけプロセッサの番号なのか?
で、調べると確かにそうらしい。
変なの!

さらに調べると、ゼロの代わりに、
digitalPinToInterrupt(Arduinoのピン番号)と書けば他と同じArduinoのピン番号でできるとか。
そんなのわかるかテメー!

と言うわけでやってみると確かにノックセンサー、ちゃんと反応する。
LEDの光り方を変えられる。

…今日はそこまで。
こんな事やっていたから今日は猫たちを散歩に連れて行かなかった。
欲求不満で夜起こしに来るかもしれない。
おやすみなさい。


火事検出器 その1

2016-07-21 13:49:23 | ABCのAはArduinoのA
先に書いておきます。
この方法、他の人には勧めません。どちらかと言うと....
やらないでください。



いろいろなプロジェクトを平行してやってしまっているが、今回は火事を検出するセンサー。

先日、市販の火炎センサーをテストした。
家から蚊取り線香を立てるステンレスの皿を持ってきて、中にトルエンを少量。
そして意を決して火をつけた。

ボワッと大きな炎が上がる。
色はオレンジだった。
話の中ではトルエンなどの溶剤は無職、じゃなくて無色の炎を上げるとなっていたが、
なぜかオレンジだった。
煙も少し出ていたから不純物か不完全燃焼ぎみだったのか?

そう言えば以前にボヤ騒ぎになった時のビデオ映像もオレンジの炎だった。
化学実験のようにはならないらしい。

正直言って、火をつける実験は怖い
燃え方が尋常じゃない。
それも室内で。

なぜ室内かと言うと、実際のセンサーの背景を実際に使う時と同じにしたかったから。
その場所にセンサーを設置するのだ。

でも、とりあえず、安いけど市販の火炎センサーは使えることがわかった。
3m離れたところでトルエンの炎を瞬時に検出し、センサー本体のLEDを点灯させていた。


今回はそれを踏まえてArduinoで作ってみた。
まだ完全ではないけれど、こんな感じでやってみる。



ところで、火炎センサーは本当は通常の火事を検出するものだと思う。
トルエンのために使う人なんていないはず。

このセンサー、IR側の波長を検出する。
IRと言っても可視光からちょっと出ただけの部分。
完成品として売られているセンサーはもう少し可視光の外側ぎみのものが多い。
高度なのになるとIRに加えて紫外線も2点追加して3点検出している。

が、それとて通常の火事を想定したものになっている。
どこをどう見てもトルエンの火災で使えますなんて書いてない。
結局、やってみないとわからないのだ。

しかも、溶剤の炎色は無色となっていてスペクトルはこうですよ、と
説明してくれる人もデータもどこにもない。


かと言って、あきらめて温度検出とか煙検出で妥協するわけにはいかない。
そりゃ、6畳間とか、小さな部屋ならそれでも良いけれど、
大きな工場では反応するまでにかなり燃え広がって初期消火ができないかもしれないし、
逃げ遅れるかもしれない。

だから、作ると言うわけだけれど、
これに本当に生命を預けて良いのか?、と言う大きな問題が立ちはだかる。


そう言うわけで、この方法、他の人には勧めない。
やらないでください。





今朝はひどい渋滞だった。

家から出て高速道路に入るあたりの分岐点で2台の車が正面衝突していた。
対向車線からこちら側にはみ出した白いセダンは鼻先が無いような状態。
こちら側車線の車は見えなかったが側に何人ものインド人が立っていた。

白い車は中国人だったが事故からもうずいぶんと経っていたはずなのに呆然と
ただ、立っていた。

マレーシアらしく警察は来ていない
あれ、自分で車を持って警察署に行かないと処理できないと思うと哀れだし、
変なシステムだと思う。


自分は他の国の事を知っているから変だなと思うけれど、
ここにずっといて、これが普通と思っている人には普通なんだろう。

もしかして警察なんて面倒なもの、来てくれない方が良いと思っていたりして...


それにしても、こうして外国人だからいろいろ相対的に見られるわけだけれど、
これがずっと日本にいたら同じ事なんだろうな、と思う。
日本から見てマレーシアが変と思うように、マレーシアにいて日本を見るととてもだ。

帰国と言う言葉を使ってマレーシアから日本に行く人はけっこういる。
あたりまえだけど、でも、日本に行くって"帰"なのだろうか?
と、ちょっと思う今日この頃。

チーチ3号改造計画 その9 (WTV020SD オーディオモジュール編3)

2016-07-20 00:00:01 | ABCのAはArduinoのA
その後、どうやら音がちゃんと出せるようになったようだ。

やはり、コツは音源の音量らしい。
写真のように±0.3程度になっていた時に上手く再生できた。

それと、スケッチの方は"asyincPlayVoice"を使う方が"PlayVoice"より長く再生できる。
Play...の方は2秒しか再生できないのかもしれない。
このあたり、どこにも書かれていないようなので困る。

もちろんライブラリの中にあったサンプルスケッチにはそんな事が書いてあったけれど、
あれはちょっと不親切なコメントなのだ。



WTV020SDはもう1個注文したのだけれど、
もしかして、他にもっと使い易いモジュールがあるかどうか検索してみた。
確かに、無いではない。つまり、ある。

でも、このモジュールよりかなり大きくてチーチ3号に内蔵できそうになかったり、
アンプ機能が無くて直接スピーカーを鳴らせなかったりするものばかり。
それに、マレーシアにはあまり無い。
なので、結局WTV020SDを使うしかないらしい。

ガンバロ…



さて、次の目標は自分で声を録音してそれを再生させる事。
パソコンのマイクだと音が悪いのでiPadで録音しよう。

チーチ3号改造計画 その8 (WTV020SD オーディオモジュール編2)

2016-07-19 12:50:42 | ABCのAはArduinoのA
今日、またArduino関係パーツをたくさん注文した。

これはチーチ3号計画のためではなくて、作業機械の安全器を2つばかり作るため。
1個は火炎センサー、もう1個はオーバーヒート・センサー。
1つはそれほど難しいものではないので最近入ったリーダーに任せてある。

最近、マレーシアの工業高校卒レベルでもArduinoには触るらしい。
それほど知識が深いわけではないが、知っているだけマシ。
ちょっと前の同じ学歴の人間だとそう言うのが全然ダメで何をやっても使いものにならない。
学校にもよるのだろうか?



オーディオモジュールのWTV020SD、音は出せたのだけれど、満足な音質になっていない。
困っている。

音源の音量が大きいとダメ(-6dBより小さくせよとの事)と書いてあったので小さめにしたり、
音量の大小の差があるまま小さくするといけないかと思ってコンプレッサーをかけたり、
きれいな音源でないといけないかと思ってCDの音源にしてみたり、
いろいろやってみた。


けれど、音は出る、でも変だ。

最初音量が聞こえない位小さくてそのうち音が割れるほど大きくなる。
また小さくなる、と言うように海のうねりのように音量が変化している。
接続も問題無いようだし、わからない。



と、このページではArduinoからの3本の線に470Ωが1個づつ入っている。
他のページの回路図には無いのに。

これは今夜やってみる。
あまり関係ないような気がするが、とりあえずやってみる。



もしかして、モジュール自体に問題があるのか?と言う懸念もある。
なので、もう1個買ってみる。
会社のパーツとともに明日か明後日には来るだろう。
お楽しみに。



今日は会社のスタッフでハリラヤ明けのお祝いのランチ。
が、自分は行かない。
行けない。

この後、午後1時15分に業者さんが来る。
その後、2時にも別の業者さんが来る。
そのさらに後、4時にまた別の業者さんが来る。

って言うか、もうハリラヤなんてかなり昔の事の感覚になっていて、どっちでも良いような...
(ホント言うと、そう言う集まりが嫌いなのだ。)

チーチ3号改造計画 その6 (割込みプログラム編) (表示改善)

2016-07-09 13:13:13 | ABCのAはArduinoのA
オーディオ関係はちょっと置いておいて
最初のころに作った目のLEDのプログラムを見直し。

この見直しは割込みの処理を含めてのもの。
この前書いたように、割込みのやり方が間違っていたと気付いたのを踏まえて
その、素人らしい間違いをここに記録しておこうと思う。

最初に書いたLEDの光らせ方のサブルーチン(Function)がこの下の3つ。
(ブログの中では各行の先頭が全部そろってしまって見にくいのはごめんなさい。)
----------------------------------------------------------------

//左右の目が同時に点滅するもの。
//難しくないので解説はいらないと思う。Rは右でLは左。
void FlushRL(int R, int L) {

for (int i = 0; i <10; i++) {

//デジタル出力の後にアナログもできる。
//最初はアナログの値を1づつ変化させたのだけれど、見た目は5位が丁度良かった。

void FireFly(int R,int L) {
for (int i = 0; i < 5; i++) {
for (int val = 0; val < 255; val = val+5) {
analogWrite(R, val);
analogWrite(L, val);
delay(15);
}
for (int val = 255; val > 0; val = val-5) {
analogWrite(R, val);
analogWrite(L, val);
delay(15);
}
}
return;
}


----------------------------------------------------------------


この下がチュートリアルを見て作った割込みのスケッチ。
これでもある程度動く(確か前の記事にビデオを載せた)けれど、
あまりに制限事項が多くて自由度が無い事に気付いた。
従って、これは悪い例

----------------------------------------------------------------

//volatileを付けたのはLEDのピンを割込みのサブルーチンで直接指定しなければならなかったから。
//もちろんこれは悪いやり方なのでこうなっている。

volatile int EyeR = 11; //R eye pin
volatile int EyeL = 10; //L eye pin
int Shk1 = 2; //Shock pin
int Shock;


void setup() {

pinMode(EyeR, OUTPUT);
pinMode(EyeL, OUTPUT);
pinMode(Shk1, INPUT);

//ここで割込み。
//割込みの外部信号はショックセンサーから。
//ショックセンサーは通常でHIGH、ショック検出でLOWだから落ちたとき割込み
//割込みがあると目が左右交互に点滅するサブルーチンに飛ぶようにしている。
attachInterrupt(0, FlushALT, FALLING);

}


//通常時の処理はここ。
//通常時はホタルのようにボワボワ点滅している。
void loop() {

Shock = digitalRead(Shk1);

if (Shock == HIGH) {
FireFly(EyeR, EyeL);
}

}

//ここに蛍のように点灯するサブルーチンがあるのだけれど、省略。

//ここから下が左右交互点灯のサブルーチン。
//割込みのサブルーチンは返り血
//じゃなくて返り値が無いらしいのでvoid

void FlushALT() {
for (int i = 0; i <5; i++) {
for (int n = 0; n<10000; n++) {
// <font color="pink">サブルーチンなのに直接グローバル変数!
digitalWrite(EyeR, HIGH);
digitalWrite(EyeL, LOW);
}
for (int m = 0; m<10000; m++) {
digitalWrite(EyeR, LOW);
digitalWrite(EyeL, HIGH);
}
}
digitalWrite(EyeR, LOW);
digitalWrite(EyeL, LOW);
}

//<font color="pink">10000は時間稼ぎ。これはやってみてテキトーに決めた。
//なぜなら、本来delayでやるべきところ、割込みのサブルーチンではそれが使えないから。
//もちろんこんなのは邪道
//なので正しいと思われる割込みの使い方を考えてみた。
残念ながら、まだ検証していないけれど。


----------------------------------------------------------------

int EyeR = 11; //R eye pin
int EyeL = 10; //L eye pin


//割込みでフラグを立てるだけにした。
//こうすると割込み後に動かすプログラムに自由度が出る。
volatile int Shk = 0; //Flug for shock snsor

int ShkPin = 2; //Shock pin number


void setup() {

pinMode(EyeR, OUTPUT);
pinMode(EyeL, OUTPUT);
pinMode(ShkPin, INPUT);

attachInterrupt(ShkPin, SHKFLG, FALLING);

}

void loop() {

//通常のLEDの動作は次の3種類を想定しているけれども、
//これらは割込みによって立ったフラグの回数によってどれかに決まるようにした。
//今はショックセンサーしかないけれど、もう1つ割込みに使える何かがあれば
//もうちょっといろいろなパターンができるはず。

if (Shk == 0){
FireFly(EyeR, EyeL);
}

if (Shk == 1) {
FlushALT(EyeR, EyeL);
}

if (Shk == 2) {
FlushRL(EyeR, EyeL);
}

}


//ここから下の3つのサブルーチンは一番上のものと変らない。

void FlushRL(int R, int L) {

for (int i = 0; i < 10; i++) {
digitalWrite(R, HIGH);
digitalWrite(L, HIGH);
delay(100);
digitalWrite(R, LOW);
digitalWrite(L, LOW);
delay(100);
}
digitalWrite(R, LOW);
digitalWrite(L, LOW);
return;
}

void FlushALT(int R, int L) {
for (int i = 0; i < 10; i++) {
digitalWrite(R, HIGH);
digitalWrite(L, LOW);
delay(100);
digitalWrite(R, LOW);
digitalWrite(L, HIGH);
delay(100);
}
digitalWrite(R, LOW);
digitalWrite(L, LOW);
return;
}

void FireFly(int R,int L) {
for (int i = 0; i < 5; i++) {
for (int val = 0; val < 255; val = val+5) {
analogWrite(R, val);
analogWrite(L, val);
delay(15);
}
for (int val = 255; val > 0; val = val-5) {
analogWrite(R, val);
analogWrite(L, val);
delay(15);
}
}
return;
}


//ここから下のサブルーチンが割込みがあったときに動くもの。
//割込み毎にShkに1を足す。
//3より大きくなったらリセットして0に戻る。

// Shock sensor flug

void SHKFLG() {
Shk++;
if (Shk > 3) {
Shk = 0;
}

}

----------------------------------------------------------------

このプログラムはサブルーチンの試験だけなのであまり複雑じゃない。
実際のチーチ3号はもうちょっといいろやりたいところ。
それに声も出せるようになるはずだし。

チーチ3号改造計画 その5 (WTV020SD オーディオモジュール編)

2016-07-08 15:01:57 | ABCのAはArduinoのA
マイクロSDカードが来たので早速チーチ3号から声が出るようにしたい。

が、声を出すにはこのWTV020SDを攻略しないといけない。
簡単かと思いきや、意外と難物なのである。

と言うのは、まず、日本語情報がほとんど無い。
みんな、面倒な事はやらないのだろうか?

日本も売っているのに。

スイッチサイエンスで売られているこれ、形が違う。
が、中身は同じようなもの、と英語のフォーラムに書いてあった。
実際、スイッチサイエンスさんのこのページの下の方にあるリンクをクリックすると共通資料が出てくる。

とりあえず、参考になるのは英語のサイトだ。
How to use WTV020SD music module with Arduino
上手い具合にそんなに難しい英語じゃないのでたぶん中学生でも読める

と、言ってしまうとミモフタモナイので最低限の事をここに書いておこう。


1. このソフトをインストールする。
このソフトが必要な主な理由は、音量制限が必要な事、ステレオをモノラルにしたい事など。



2. WAVファイルかMP3ファイルを用意する。
音楽でなくて自分で録音した声などで良いのならこのソフトで録音できる
赤いボタンを押すだけでOK。

必要な部分だけ選んで(グレーになる)、トリミングボタンを押す。

3. モノラルに変換しておく。
WTV020SDはステレオは再生できない。スピーカーも1個しか付けられない。


4. 音のレベルが大きすぎると再生がテキトーに停止してしまうので最初に音量を下げておく。



5. サンプリングレートも変更しておく。
WTV020SDはad4と言うファイル形式で6kHz~36kHzのレートで再生できるらしい。ある人が書いているのを読むと32kHzでできていたそうなので、今回は冒険せず、32kHzを選んでみた。

6. そこまでできたら、音声ファイルを書き出しでおく。

メニューにはプロジェクトの保存とオーディオの書き出しがあるけれども、
必要なのは音声だけなのでオーディオの書き出しを選ぶ。

選ぶときのファイル形式はwavでOK。


さて、ここからさらにもう1つ、ファイル形式変更をしなければならない
そのファイル形式はad4と言う聞きなれない名前のもの。
日本では弥生会計と言うソフトが使用している形式の拡張子だけれど、それとは全く違う。


このページの下の方にダウンロードのリンクがあるのでUSB Recorderと言うソフトをダウンロード。


How to convert mp3 and wav files to ad4 format- wtv020SD-16P tutorial

ソフトの名前がなぜかSUMO toolになっていて実際にダウンロードされる名前がUSB...と不安になる。
でも大丈夫らしい。

ダウンロードへのリンクは3つあるけれど、一番下のところが分かり易かった。

USB recorderの使い方は簡単。
さっきAudacityから書き出したwavファイルをad4にエンコードするだけ。

が、困るのはエンコードしたad4ファイルが再生可能になっているかどうか、
PC上で再生して確認できない事

とりあえず、ここまでで再生に必要なファイルは用意できたはずです。


つづく



今日は朝からある工場へ行ってきた。
ハリラヤ直後だと言うのにちゃんと操業していたのはさすが中華系のオーナー会社。
外国人労働者も、たぶんムスリムだろうけれどちゃんと出てきて仕事している。

そこには今までやった事のない作業を、単に設備があるからと言うだけでお願いしている。
今日は修理から上がってきたばかりと言うその設備を見に伺った。
大丈夫そうだ、と勝手に決める。

ダメモトなのだ。
でもできたらけっこうすごい"はず"、と、これも勝手に思っている。


Arduinoを使ってつくる別のプロジェクト、簡単そうなのでリーダー格の者に任せる。
パーツはここにあるから自由に使って良いよとメッセージ。
返って来た答えは、プログラムするのに元になるものをネットから落とさないといけない。
でも作業場のPCはネットに繋がっていないと言うわけ。

お前、そんなところで仕事を止める程度の人間なのか?自分でどうにかせよ。
と返信。

マレーシアの場合、こうしたつまらない所でできないと結論を出して停止してしまう事がよくある。
本当によくある。
面倒なので相手にしない事に決めている。

チーチ3号改造計画 その4 (DC-DCコンバータ編)

2016-07-07 23:13:41 | ABCのAはArduinoのA
昨日、キャサリンさんにお願いして買ってきてもらった乾電池式充電器
今朝、到着。早朝6時に空港到着。

参考にさせていただいたのはこちらのサイト。
迷い箱 過去ログ 2009年後半ぶん←ありがとうございます。

いろいろ検索してみると古い情報が多いにしても、100円ショップのセリアで入手できるとの事。
なのでセリアを検索して場所を特定、念のため国際電話で実際にその店があるかどうか確認してみた。
が、人気のためか、セリアさん、品切れ。

近くにあったキャンドゥーには似たような製品があるとわかり、2個買ってきてもらった。

開けてみると、ネットで見るのと似たような基板が出て来た。
でも、ちょっと違う。アップデートされているのか、それともさらにコピー品なのか…

製品としては乾電池2個、3Vで5Vを得るものだけれど、情報によれば3本でも5Vが出る事になっている。
早速やってみた。なぜならオリジナル・チーチ3号は単4乾電池3本仕様なのだ。

本当だ。テスターで4.95V出ていた。
使えそう!

そして、サイトに書かれていたようにUSBジャックを外す。

上は配線とレイアウトしてみたの図。
1. オリジナルではここに電池のマイナスが繋がっていた。
2. オリジナルではここからの線がモーターに繋がっていた。
今回はこの1と2を交換。
3. ここは繋がっていなかったのをArduino側の電源GND側に接続。
つまりモーター・モードと悪態モードの切替式にしてみた。
そのうちモーターもーArduino経由でコントロールできればと思うけれど、今はしない。
4. この下に電池ボックスのプラス端子があるので電線をハンダ付け。
5. これを充電器から取った昇圧ユニットに接続。

昇圧ユニットはチーチ3号の背中のあたりに取り付ける事にした。
なぜか突起があるのでそれに引っ掛けるようにして、
テスト用電線の先のプローブを基板の両端の凹みに突き刺して留めてみた。
(振動で外れてしまうかもしれないが…)

仮組みしてみるとこんな感じ。だんだんSFっぽくなってきた?

背中の接続部分が露出しているのはオーディオ・モジュールの電源を接続するために置いてある。
本来ならターミナルでもちゃんと付けるべきなのだけど、今回はそこにハンダ付けでまとめる。


ところで、日本からの調達品はもう1つ。
2GBのSDカード。
マレーシアにはどうも最低で4GBのものしか売っていない。
日本ではヨドバシカメラなんかでも簡単に買える。
ちょっと高い。
これ2個買う値段でUnoとnano互換機なら4つも買える。
チーチ3号なら7匹も買える!

…フッ、と我に返る…
チーチ3号は1匹300円。
これにnano、センサーや各モジュール、それにSDカード…
何倍も高くなっているね。

大昔のアメリカのテレビドラマで100万ドルの男とか、バイオニック・ジェミーってのがあった。
エライ金かけて人間を改造するのだなぁと思ったけれど、改造ってやっぱり金かかるね。
チーチ3号、面白くなると良いなあ。

でも、明日から仕事が始まるので改造のペースは遅くなると思う。
でも、その間にソフトの方も何ができるか考えよう。

チーチ3号改造計画 その3 (ハードウェア・レイアウト編)

2016-07-06 21:24:18 | ABCのAはArduinoのA
ハリラヤ休暇も残すところあと2日。(今日含む)

今日は組み込みのレイアウトを考えてみた。
それは写真を見てもらえばわかると思うので言葉による説明を多くはしない。

ただ、この組み込みの中で今後絶対に問題になるはずの事が1つある。
それはバッテリー問題

改造前のチーチ3号は単4乾電池3本で動いている。
つまり電圧にして4.5V。中途半端だ。
これに対してArduino unoは5Vの電源を必要とする。

そうなると、解決策は…
1. 仕方ないからチーチ3号は永久に外部電源にワイヤーで繋がれたまま。
→猫らしくないから却下。

2. バッテリーを背中に積んで改造されたアンドロイドらしくする。
→チリ紙博士があきらめたくないから却下。戦闘能力が落ちる。

3. 無理やりバッテリー内蔵化。
→iPhoneのように交換できない充電式にせざるを得ないが、充電回路が危険なので却下。

4. Arduino nanoを止めて3V駆動できるArduinoシリーズに交換。
→予算的に許されないかも。また、確かノックセンサーは5Vを要求するような気がする。

5. 既存の単4乾電池をDC-DCコンバーターで5Vに昇圧してバッテリー共用。
→ネットを調べていたら日本には乾電池2本でUSB経由スマホ充電器と言うのがあるらしい。
しかも100円ショップで売っていて、コンバーター部分を取り出して使えるとか。
急遽、日本にいるキャサリンさんに連絡して2個ばかり買ってきてもらう事にした。

(もちろんブーブー言われた。)

さらに、もしかすると、同じユニットを使ってオーディオモジュールの3.3Vも(降圧だけれど)作れるのか?
こっちはちょっと後で研究してみよう。
(普通に3端子レギュレータ買え?、そうなんだけど…)


頭の中にオーディオモジュールを入れる。
ピンのハンダを外そうかと思ったけれど、スポンジのまま固定していても支障なさそう。

頭を支える首パーツにnanoを固定。

ノックセンサーは腰のあたりに固定。
歩くとノックセンサーが反応してしまいそうなのだけれど、それはスケッチ上でどうするか考える。
もしかすると、歩きモードと悪態モードに切り替える事になるかと思う。
電池のスイッチが実は単なるON-OFFではなくて切替スイッチになっているから可能だろうし。


今日は断食が終わってハリラヤに入った初日。
近所のAEONは何と今日だけ午後1時開店。ダイソーも。
朝10時に最近運動不足だから歩いてダイソーに行ったのに無駄だった。

それで街に出たら、やっぱり主要な店は閉まっていた。
日本で正月に店が閉まるのと同じ原理だから文句は言えないのだけど。

街はマレーシア人がほとんどいなくて、歩いている90%以上が外国人労働者。
バングラ、ネパール、パキスタン…
マレーシアじゃないみたいだった。

だからいつものナン屋さん、大繁盛。
今日はちょっと辛めの味付けだったのは彼らに合わせたから?



追記
ところで、昨日の割込み処理で大きな誤解をしていたと、突然気付く。
だって、事がArduino位だろ、実例がそんなに多くない。
だから調べてもチュートリアルと似た例しか出て来ない。

それと日本語で検索しているとハードウェアも日本の多くの店で買えるものを起点にしていて
なかなか有用な情報が少なかったりもする。
あまりバラエティーに富んで無いかもしれない。
マレーシアでやっているとちょっと違うのがあるので困る。

さて、割込みだけれど、当初思っていたアイデアは、
1. setup()に割込みの処理を書く。
2.割込みから指定された関数とかファンクションに飛んで処理。
3.割込みが無いときはloop()の中の事を実行している。
と思っていた。

でも、これは間違いだと思う。
なぜなら、上のようにやる限り、割込み時の関数に引数が指定できない。
それができないといつでもグローバル変数そのままを使うしかなくなる。
場合によって変える事ができないからけっこうつまらない。
また、delayなどの時間を扱う関数が動かないので時間稼ぎに変な処理をしないといけなくなる。
これも変。

それで、考え直してみた。
多分、こうするのが良いと思う。
1. setup()に割込みの処理を書く。(同じ)
2. 割込みから指定された関数とかファンクションは、割込み有りのフラグを立てる程度の物にする。
3. 上記のフラグをreturnしておいて、loop()の中の処理の条件にする。

こうやると最初に思っていた問題点はみごと解決するんじゃないかと考えている。
が、考えているだけで、まだ何もスケッチ書いていない。

明日、早朝に空港まで運転しないといけないので、今日はここまで。

チーチ3号改造計画 その2 (部品調達と割込処理編)

2016-07-05 23:29:02 | ABCのAはArduinoのA
昨日はヘマをしてMP3モジュールを間違えて買ってしまった。

なので昨日のうちにArduinoからコントロールできる物を予約。
そして今日、引取りに行った。
調達先は、最初にパーツを買った店。
KLの南側なので車で1時間かかる。

実は、この店、自分で引取る場合はRM18以上でないとダメとなっている。
なのでノック・センサーと言うのを探して一緒に買う事にした。

ノック・センサーはドアをコンコンしたような場合の振動を感知するもの。
それをサイトで発見した時に思った。
チーチ3号を叩いた時に何か反応するようにできるのではないか?と。

だが、さて、なぜ2個も買ったかと言うと、別に頭と胴体両方にとか、
例によって他の事に使おうとか、そう言うのでは全くない。
実は、注文した時にミスして、引取りのボタンを押さなかったのだ。

それで何が起きるかと言うと、RM8の送料が自動加算されてしまう。
しかも、カードなのでキャンセル不能。
と言うとわけで、送る代わりにもう1個いただいて来たと言うわけ。

さらに、もう1つ、思ってもみないミス発覚。
SDオーディオユニットは何と、この時代に、2GBまでのSDカードしか認識しないのだった。
が、そんな物どこにでもあると思って近所のAEONに行ったら、最低が4GBだった。
なので、せっかく買ったのに今のところ使えない。
なぜなら明日から正式にラマダン終了後のハリラヤ休暇に入るから。
店、どこも空いてないだろう。

ところで、ついでにもう1個、LM35と言う温度センサーを買っているけれど、
これはチーチ3号と関係無くて、仕事で実験するための物。

Chee-Chi No.3 eye flush study


結局、今日の成果はこのビデオ。
ここまで来るのに5時間かかってしまった。

えっ? 全然難しそうじゃない?
いえいえ、初心者には難しいスキルが必要です。
光り方を変えるのはそりゃ、すぐにできる。

でも、ショックを与えた時だけ光り方を変えるのはちょっと難しい。
今日は疲れたのでスケッチ載せませんけれど、解決しなければならない点は2つ。

1. 割込み処理
これはショックを検知してそれにすぐ反応させる方法。
これの処理は結構いろいろな制約があって、単にショック信号でこう光れと言うのができない。
delayが使えないから人の目に見えるチカチカを普通に作れないと言うわけ。

2. 時間稼ぎ
ちょっとバカらしいのだけれど、わざと時間がかかるようにプログラムを作る。
これはチカチカのため。

ところで、元から付いている目のLED、外せないのでそのまま使う事になった。
仕様がわからないけれど、素人から見れば普通のLEDなんてあまり違わない。
プロには叱られるかもしれないけれど、だいたい両端電圧2V前後、電流は10から20mA。
そう思っておけば間違いないので、抵抗なんて100から300の間でテキトーに選んでやってみればOK。
今回は買ってあった中から220Ωを使ってみた。
近いのはそれしか無かったし。

と、今日はここで終わり。
おやすみなさい。

チーチ3号改造計画 その1 (創世編)

2016-07-04 21:31:21 | ABCのAはArduinoのA
世界征服をたくらむ秘密結社チョッカーはチーチ3号を拉致、
そして近く改造しようと計画している。

チョッカーの総統であるチリ紙博士は密かに部下に命じ、改造に必要なパーツを集めさせた。
パーツはKLにあるいくつかの地下組織が隠し持っている物である。
多くのパーツは赤の国から秘密のルートを通って運ばれている。
未だかつて、そのルートを解明した者は誰もいない。

今日調達されたパーツは以下のような物である。


ただ、このパーツの中にはチーチ3号以外に使われる物もある。
チーチ3号に使われる物は、
1. 心臓部となるArduino nano
2. …なんだよ、それだけじゃん!

その他はチョッカーの別のプロジェクトに使われる。

実は、MP3モジュールは間違って買った。
これhスタンドアロンでMP3プレーヤーとして使えるもので、袋を開けるまでわかっていなかった。
なぜなら地下組織の保管庫内はガイコツの中にロウソクを灯しているだけなので暗く
判別不能だったのだ。
だが、チリ紙博士はこれを持ってきた戦闘員に容赦はしない。
先ほど大阪名物パチパチ・パンチとなった。

袋を開けてしまったために返品できなくなったのだ。
まあ良いわ、秘密結社のどか適当な費用に混ぜて申告してしまおう。
秘密結社はあらゆる物を闇に葬るのが上手いのだ。

また、代わりに別の地下組織に素早く連絡を取り、チーチ3号に適用可能なMP3モジュールを予約した。
秘密結社と地下組織の間でも今はオンラインでカード決済が利く。
平和ボケした人間ども、秘密結社がお前らの決済システムを便利に使っているとは想像もしまい。
フッフッフッフ…(笑)



人間どもよ、メイドカフェの土産に一つ良い物を見せてやろう。
Arduino nanoはこんなに小さいのだ。
名刺に乗せてある、これだ。

これは正規に作られたArduino nanoではない。
愚かな人間どもはそんな事にも気付かなかっただろう。

これは秘密結社が赤の国のQと言うコードネームで呼ばれる技術者に作らせた
精巧なコピーなのだ。

そう、このサイズであればチーチ3号の機敏な動きを全く阻害する事なく組み込める。
脳に埋め込むか、それとも背肉に貼り付けるか、しれともカルビにするか、
これは後でチリ紙博士が決めるであろう。

予定しているパーツは今のところあと2つ。
1つはさっき言ったMP3モジュール、これでチーチ3号は悪魔の声を手に入れる事だろう。
もう1つはショックセンサーだ。
ショックセンサーはチーチ3号が敵と戦ってダメージを受けそうになった時に効果を発揮する。
敵の攻撃によるショックに素早く反応して
何と、悪態をつくのだ。

これには人間ども、さぞ驚く事だろうよ。
はぁーっはっはっは。(笑)


ところで、不気味に光るあの青い目だが、これは殺人ビームに生まれ変わるはずだ。
楽しみに待っておれ、愚かな人間どもよ。
新生チーチ3号の出現に逃げ惑うお前たちの姿が目に浮かぶようだ。
マレーシアのカキ氷、ABCでも食って待っておれ!
ピーナツとコーン缶にちょっと違和感があるぞ。

スピードメーターその後5

2016-07-02 12:38:05 | ABCのAはArduinoのA
早速、回転数を計測するサブルーチンのスケッチを書き直してみた。
(まだ実際に走らせてはいないので不都合があるかもしれない。)

その前に、ライントレースセンサーモジュールの論理がHIGH-LOW逆だったことに気付いた。
でも、これはどっちでも良い。ONからOFFになった時をカウントしてもその反対でもかまわないから。

今回は、前回がある時間内のパルス回数を計測する方法だったのを止めて、
パルスとパルスの時間間隔を計測する方法に変えた。
(理由は前記事参照してください。)

以下、コメント付きのサブルーチン。
-------------------------------------------------------------------


//RPM Count function

int RPM(int Sig){

int t[2]; //time array
int val; //current value of Sig pin
int val_old; //previous value of Sig pin
int hit = 0; //initialize hit counter as 0

t[0] = millis(); //intial time check 時間計測開始


//前回までは最初にSigをLOWに固定して定義していた。
//これを改めて、最初に1回、実際の値を読ませることにした。
//強制的にどちらかの値を入れてから開始するとそれで1回目のカウントになってしまうから。

val_old = digitalRead(Sig); //initial signal status reading


//今回はパルスの立ち上がりが3回になる(hitが3になる)までなのでdo whileを使う。
//パルスの検出の仕方は前回までと同じ。

do {
val = digitalRead(Sig);
if(val == LOW && val_old == HIGH){ //LOW is ON pulse
hit++; //if signal LOW after HIGH, hit count +1
}

val_old = val; //new value shifts to old

} while (hit == 3); //counted _|~|_|~|_|~|_

t[1] = millis(); //end time check 終了時間の計測。

//時間計測とパルス計測の実際の時間にはズレがあるけれども、これは後で検証。
//もしズレていれば時間にバイアスをかけることにしようと思う。

//回転数の計算は2パルス分の時間で60秒x2を割る。

int rpm = 120000 / (t[1] - t[0]); //RPM = 60x2/time

return rpm;

-------------------------------------------------------------------


ところで、スケッチのコメント、実際は英語だけで書いている。
なぜかと言うと、これを他人(マレーシア人)に渡すから。
ブログに書くように長い文章のようなコメント入れるわけにも行かないから
できるだけ短い文にするけれど、それでわかるんだろうか?


昨日、帰ってから朝7時15分の出勤直前までうちのキナコ(♂猫)が夜遊びから帰って来なかった。
キャサリンさんがいないので自分で夜11時頃と朝と、探しに行ったけれどいない。
と言うことは、少なくとも昨日の夕方から朝まで何も食べていない。

うちの周り、時々猫が神隠しに遭ったようにいなくなることがある。
前はニーニ(野生♀)、その前はマダラちゃん(野生♀)、最初はキナコの母のポコ。
だから返って来ないと、もしかして!と思ってしまう。
とりあえず帰ってきてよかった。
何だか身体がホコリっぽかったけれど。


Arduino関係の会社にあるパーツ、明日から木曜まで長い休暇なので全部持って帰ろう。
できるかどうかわからないけど。


ところで、他のプロジェクトの案ももういくつか考えてあって、
工場のリーダーたちに任せようと思っている。
工業高校レベルだけれど、卒業制作でArduinoをちょっとやったことがあるらしい。
期待していよう。

スピードメーターその後4

2016-07-01 08:22:32 | ABCのAはArduinoのA
動作確認していないスピードメーターのスケッチ、やってみた。
結論から言うと、スケッチが正しい、正しくないの前にダメだった。


と言うのは、パルスカウントの分解能が使う回転数と合ってない。
シャフトには1つのアルミテープを貼って1回転で1パルスと思っていた。
が、1分間で280パルス、1秒間で4.66パルス、0.1秒間(100m秒間)で0.5パルス。


冒頭のperiodで指定したのは時間ではなくてパルスをカウントする回数なのだけれど、
これが実際にどの程度の時間になるかと言うと、約0.1秒間。

つまり1回パルスカウントするか、しないかと言うところ。





さて、実際にセンサーの前に指を置いてちらちらしてみる。
パルスを受け付けてカウントが0.1秒間に1回になることもあれば、0回になる事もある。

1回になると、上の計算では何と、600rpmになってしまう。
計算上あたりまえ。

0回だと、0rpm。
これもあたりまえ。

って事は、分解能(最初アップした時間違って解像度と書いてました)は600rpm。
全然実用にならない。


と言うことで、この問題を解決するには

(1)シャフトにもっとたくさんのアルミテープを貼って1回店でもっとパルスが出るようにする。
→けっこうたくさん貼らないといけないので実用にはならなそう。
→ストロボ柄のテープを探してきて巻きつける。(あるか?)

(2)パルスとパルスの時間間隔を測って回転数とスピードに変換する方式に変える。
→後で考えてみる。



別の問題。

計算値がなぜか557などの変な値になっている。
→今後解明。


さらに別の問題。

LED点灯表示がうまくできていない。
→ハードの方で接続がテキトーだからかもしれない。


つづく

スピードメーターその後3

2016-06-27 13:41:53 | ABCのAはArduinoのA
以下のスケッチはコピーして使えますが、残念ながら未だ実機で動くかどうか検証していないです。
そのうちやって報告します。
所々コメント入れます。


//Sensor section UNOの入出力のピン数の関係から4系統までにしました。
//センサーは以前書いたようにライントレースに使う、デジタル出力があるセンサーです。
//デジタル出力があるセンサーの方が使い易いからと言う理由です。HIGHとLOWでやれば良いから。

unsigned long period = 1000000; //Sig checking period

int Sig01 = A0; //RPM input1 pin number (Digital IN)
int Sig02 = A1; //RPM input2 pin number
int Sig03 = A2; //RPM input3 pin number
int Sig04 = A3; //RPM input4 pin number


//Display section
//74HC595を使うので1つの表示に3本のピンを使います。
//LED表示は16個あるのですが、74HC595を数珠繋ぎすれば良いのでピン数は増えません。

int clockPin01 = 13; //clockpin number(1)
int latchPin01 = 12; //latchpin number(1)
int dataPin01 = 11; //datapin number(1)

int clockPin02 = 10; //clockpin number(2)
int latchPin02 = 9; //latchpin number(2)
int dataPin02 = 8; //datapin number(2)

int clockPin03 = 7; //clockpin number(3)
int latchPin03 = 6; //latchpin number(3)
int dataPin03 = 5; //datapin number(3)

int clockPin04 = 4; //clockpin number(4)
int latchPin04 = 3; //latchpin number(4)
int dataPin04 = 2; //datapin number(4)

byte data[16];


//for Calculation
//スピード(周速)を測るローラーの直径が240mmなのでそれにπを掛けた定数を予め用意しています。
//もし直径が違うものがあればもう1つこの値DxPを増やせば良いです。
//Baseと言うのは機械に設定されている通常のスピードです。
//もしスピードの設定が変わったらこのBaseの値を変えます。

const float DxP240 = 0.753; //Diameter240 x π
const int Base = 200; //base speed [m/min]


void setup() {

Serial.begin(9600); //for debug only

//Sensor section
pinMode(Sig01, INPUT);
pinMode(Sig02, INPUT);
pinMode(Sig03, INPUT);
pinMode(Sig04, INPUT);

//Display section

pinMode(clockPin01, OUTPUT);
pinMode(latchPin01, OUTPUT);
pinMode(dataPin01, OUTPUT);

pinMode(clockPin02, OUTPUT);
pinMode(latchPin02, OUTPUT);
pinMode(dataPin02, OUTPUT);

pinMode(clockPin03, OUTPUT);
pinMode(latchPin03, OUTPUT);
pinMode(dataPin03, OUTPUT);

pinMode(clockPin04, OUTPUT);
pinMode(latchPin04, OUTPUT);
pinMode(dataPin04, OUTPUT);

//ここから下は各スピード毎のLEDの光らせ方です。
//1のところが光り、0のところは光りません。
//LEDは16個が1セット(74HC595を2個づつ使うから)なので16種類用意しました。
//このあたりの書き方、ちょっと幼稚な気がしますが、初心者なので…

data[0] = 0b0000000000000001; //LOW speed
data[1] = 0b0000000000000010; //194 Dancer -limit
data[2] = 0b0000000000000100; //195
data[3] = 0b0000000000001000; //196
data[4] = 0b0000000000010000; //197
data[5] = 0b0000000000100000; //198
data[6] = 0b0000000001000000; //199
data[7] = 0b0000000010000000; //200
data[8] = 0b0000000100000000; //201
data[9] = 0b0000001000000000; //202
data[10] = 0b0000010000000000; //203
data[11] = 0b0000100000000000; //204
data[12] = 0b0001000000000000; //205
data[13] = 0b0010000000000000; //206 Dancer +limit
data[14] = 0b0100000000000000; //207
data[15] = 0b1000000000000000; //HIGH speed


}

void loop() {

//Sensor section 01
//まず01番目のローラーのスピードを測ります。
//RPMはサブルーチンになっていて、中身はこのスケッチの最後の方にあります。
//spd01はスピードの値そのままが入ります。
//spd11はLEDのどれを光らせるかを決めるためのdata[??]の中の??の値です。

int spd01 = DxP240 * RPM(Sig01, period); //speed calculation m/min
int spd11 = SpdNum(spd01, Base);

//この下の部分はシリアル通信でPCにどんな値が計算されているかを見せるためのものです。
//つまりデバッグ用。実際に使用できるとわかったときに消します。

Serial.print(spd01); //for debug only
Serial.println(" m/min"); //for debug only

//Display section 01
//上のスピードの出力をLEDに表示させるための部分です。
//単に74HC595に出力しているだけです。

digitalWrite(latchPin01, LOW);
shiftOut(dataPin01, clockPin01, MSBFIRST, data[spd11]);
digitalWrite(latchPin01, HIGH);

//Sensor section 02
//ここからは01と全く同じですが02番目から04番目までの計算と出力です。

int spd02 = DxP240 * RPM(Sig02, period);
int spd12 = SpdNum(spd02, Base);

Serial.print(spd02); //for debug only
Serial.println(" m/min"); //for debug only

//Display section 02

digitalWrite(latchPin02, LOW);
shiftOut(dataPin02, clockPin02, MSBFIRST, data[spd12]);
digitalWrite(latchPin02, HIGH);


//Sensor section 03

int spd03 = DxP240 * RPM(Sig03, period);
int spd13 = SpdNum(spd03, Base);

Serial.print(spd03); //for debug only
Serial.println(" m/min"); //for debug only

//Display section 03

digitalWrite(latchPin03, LOW);
shiftOut(dataPin03, clockPin03, MSBFIRST, data[spd13]);
digitalWrite(latchPin03, HIGH);

//Sensor section 04

int spd04 = DxP240 * RPM(Sig04, period);
int spd14 = SpdNum(spd04, Base);
Serial.print(spd03); //for debug only
Serial.println(" m/min"); //for debug only

//Display section 04

digitalWrite(latchPin04, LOW);
shiftOut(dataPin04, clockPin04, MSBFIRST, data[spd14]);
digitalWrite(latchPin04, HIGH);

delay(1000);
}

//RPM Count function
//ここはRPMのサブルーチンです。
//入力は2個で、1つはセンサー出力Sig、もう1つは計測している時間pです。
//pは原理的にはいくつであっても良いのですが、ここではperiod = 1000000にしています。
//センサーの出力を読むArduinoの周期がperiodよりかなり速いのでできる事です。
//periodの間に何回、センサーの出力がLOWの次がHIGHになるかを数えています。
//このカウント方法が使える条件は、車のタコメーターのようにリアルタイムに表示が変わる必要が無い
//と言うことです。適当に読んでは表示、を繰り返します。
//つまりこの機械はスピードに変化があまり無いのです。

int RPM(int Sig, int p){

int t[2]; //time array
int val; //current value of Sig pin
int val_old = LOW; //previous value of Sig pin


t[0] = millis(); //intial time check

int hit = 0; //initialize hit counter as 0

for(int i = 0; i <= p; i++){

int val = digitalRead(Sig);
if(val == HIGH && val_old == LOW){
hit++; //if signal HIGH after LOW, count +1
}

val_old = val; //new value shifts to old

}

t[1] = millis(); //end time check
int rpm = hit * 60000 / (t[1] - t[0]); //RPM calculation

return rpm;

}


//Speed number function
//実際のスピードからLEDの点灯に必要な数値に変換するサブルーチンです。
//data[??]の??のところに入れて使います。
//??を指定すると自動的にどのLEDを表示するかが決められます。

int SpdNum(int spd, int Bsp){ //Comparison to base speed

int num = spd - Bsp + 7;
if (num < 1){
num = 0; //0 is all lower speed
}

if (num > 14){
num = 15; //15 is all higher speed
}
return num;
}

スピードメーターその後2

2016-06-07 08:13:13 | ABCのAはArduinoのA
こんな感じでperiodの値を調整していけばパルスカウンターの部分はできそうな気がする。

前回の手書きのアイデアをそのままスケッチにしている。


要点は、
(1)millis()でパルスがOFF-ONをカウントする間の最初と最後の時刻を見ている。
最後の時刻-最初の時刻=パルスをカウントしていた時間が出る。

(2)パルスのOFF-ONはvalの中に入れた値が前回LOWで今回HIGHになった場合に1回をカウント。
実際のパルスの入る間隔はArduinoがそれをチェックしに行く時間間隔よりかなり長いはず。
これがこのスケッチの成立する前提条件。

Arduinoはものすごく速く何回もOFF-ONを確かめに行くのでどんどんやらせて、
その中でOFF-ONになった時があれば"あったよ!"とカウントしている。

(3)後はパルスのカウント回数をmillis()で計測した時間で割る計算。
その時にRPM(1分あたりの回転数)を出したいのでマイクロ秒単位を分に替えるのに60000を掛ける。



そして今回の失敗と学び

※1 整数型(int)の中にdigitalReadで読んだHIGHとかLOWは記録できる。
びっくりした。
これは、どうなのかネットで調べたけれどそんな事している人はあまりいなかった。
でもちょっといた。

あっ、できるんだ、と思ってやってみたら本当にできた。


※2 最後の計算のやりかた。
算数的には、
(回数÷時間)x60000と、(回数x60000)÷時間は同じになるはず。

でも、プログラミングではちょっと違うらしい。
前者は最初の()内が0.0xxxになる。
これを整数型の入れ物に入れるとゼロになってしまうから
後から何をしても答えはゼロにしかならない。

後者は最初の()内は大きな数字になるからこれを整数型の入れ物に入れると
小数点以下は切り捨てられるけれどちゃんと頭の数字は残って値はちゃんと出る。

なので後者を使わないといけない。
これはちょっと考えさせられた。





ところで、これ、普通のスピードメーターとかパルスカウンターには使えないかもしれません。
注意してください。
前提条件は前のこの事を書いた記事を読んで確認してくださいね。

スピードメーターその後

2016-06-06 13:33:09 | ABCのAはArduinoのA
スピードメーターを作るつもりでいろいろやってみている。

LED出力側は74HC595を使えば何となくできそうだとわかり、
次はセンサー側なのだけれど、
センサーはこれを使うことにした。

これはロボットを作るときに床に描いたラインに従って動くようにするための
ライントレースセンサーユニット。

こうしたユニットになっていない赤外線のセンサーだけでも良いのだけれど、
これはもうデジタル出力が用意されていて、回路を自分で組む必要が無いので楽だ。
値段もRM5(150円程度)。


ボリュームでON-OFFの閾値の調整ができて、ON出力の時は緑のLEDが点灯する。


問題はパルスカウントの方法。

ネットで調べるとパルスカウントのためのライブラリがあって
それを組み込んでプログラミングすると良いと書いてある。

けれど、欠点は入力の5番ピンしか使えない事。


こちらの算段では入力を複数個、できるだけたくさん欲しいので
ほとんど全部の入力でパルスカウントしたいと思っている。
1つのピンだけしか使えないと言う事は、
Uno1個でメーター1個、仮に10系統作りたいとなるとUnoも10個必要になってしまう。

いくら1個RM16(400円)で買えるとは言え、10個ではやりたくない。


なので1個のUnoでどれだけたくさんの系統が作れるか挑戦してみることにした。

が、ネットではみなさんやはりライブラリを組み込んだタイプのプログラミングをされている。
なかなか参考になるものがない。

が、たった1つあった。
他の人と全然違う事をやっている人が。

スピンドル回転数を計測する ダ・ヴィンチの帰還

このスケッチ、見ても初心者には全然わからなかった。
なのでコピーして(写真の方が合っているらしい)やってみると、確かにカウントしている。
この時点でセンサーはライントレースユニットにしている。
別に問題ない。
なのでこれをこのまま使うことにしておいた。


が、実は後でちょっと問題が出た。
実際の回転物が無いので試験ができなくて、もう1個のUnoでLEDを点滅させてみた。
が、赤外線が出るわけではないのでダメだった。
なのでLEDを点滅させる出力を計測側の入力に直接入れてみた。
GNDのレベルも合わせた。

が、それでもダメ。


と、そうこうしているうちに、その問題とは別にスケッチの改良を思いつく。
(ダ・ヴィンチさんのがダメと言うのではなくて自分のに合うように変更と言う意味)
それが以下。



やりたい事は、入力ピンにセンサーユニットからのON-OFF信号を入れる。
適当な回数だけONになった回数をカウントする。
そのカウントしていた時間を測定して回転数を出すと言うもの。


このメーターのコンセプトは自動車のスピードメーターのように
リアルタイムにスピードを表示する事じゃなくて
いくつかの計測点の速度を順番にゆっくり測定しては表示すれば良い。

だからまず1つの入力パルスを一定期間測定。
それから表示。
次のピンのパルスを測定して表示。
これを繰り返すだけ。


適当な回数カウントするのは1分分でも良いし30秒分でも良い。
その計測時間も適当で良くて、正確に1分とか30秒でなくても良い。
23秒だったとしても、36秒でも後は計算で回転数は出る。

こうすればUnoで数系統、多分出力に74HC595を使う関係で出力ピンの数に制限されるから
4系統 in 1Unoのスピードメーターができるのではないかと思っている。


パルスの立ち上がりを検出するのは、
Unoの計測サイクルが回転数のサイクルよりたぶん充分短いだろうから
前の回のピン入力(digitalRead)のサイクルと今回の差がXX以上なら回数にカウント
と言うことでできるのではないかな、と思う。

思うだけでまだやってないが。