ちょうど遅い夏休みを取れたのと、台風が来るんだか来ないんだか曖昧な空模様なので、纏まった時間が取れました。
作業を止めてた原因
ほとんどの作業が未完成な理由
デアゴからの送り物が溜まってきてます。断片的に電子回路やラズパイなど、いろんな新しいことをかじりながら、挙句の果てには洗車模型なんぞに手を出してしまったもんだから、船倉や廊下床、アーチに関しては、つまみ食い的に作業していまいち纏めきれていませんでした。
実は昨日も、廊下のライトを必要な分だけ完成させたのですが。。
こうなる予想完成の絵はイメージできるものの、LEDをどうやって組み込んで制御しようか決めていないから、配線を考えるのが億劫になってしまい、戻り作業がイヤで、結局は何も進まないという悪循環に陥っている事に、今更ながら気づきました。単純な話なんですが。。
取っ散らかってる断片的な知識をどうやったら上手く組み合わせてて具現化できるか考えを巡らせるだけで、だいぶ時間を要してしまったので、できる事、できないことも含めて、今回のファルコンの電飾はこうしたい。というベクトルを定めないといけないなぁと思い、今日ほぼ1日掛けて試行錯誤していましした。
ブラウザからラズパイとPICを操作
Wi-Fiに接続されたスマホのブラウザ経由でRaspberry Piにアクセスし、Raspberry Piから複数のPICをコントロールする事に決めました。
決めたからには、頭の中から机上で実現させるまでを今日の目標としました。
さて、ここまででたら、その先はファルコンのユニット毎に分割して物事を考えられます。
これでやっと進められそうな感じです。
WebIOPiをインストール
まずは、ラズパイの方にWebブラウザから各ポートを制御できるWebIOPiというパッケージソフトを導入します。
導入後、ラズパイIPアドレスか変更したサーバ名で、家庭内LANに接続されたスマホからアクセスすると以下のような画面が表示され、各ポートのIOとHIGH/LOWがリモートで指定できる様になります。
ラズパイのGPIOがHIGIの時にPICが動くようにする
ラズパイの16番ピン(GPIO23)がHIGH(オレンジ色に反転)の時に、PICのプログラムがビットシフトレジスタを制御し始めて、点滅が行われるようにしました。
使用したPICは、PIC12F683。固定でINPUTO端子となっているGP3と、上記のラズパイのGPIO23を接続することでGP3がHIGIの時だけビットシフトレジスタが制御できるようになりました。
サンプルプログラム
PIC12F683のサンプルプログラムはこちら。
ネット上にサンプルがほとんど無かったため、データシートやラズパイのPythonのプログラムと比較しながら、ほとんどゼロから作った、「とりあえず動いた」版です。
/*
* File: main.c
* プログラム概要
* ビットシフトレジスタ制御テストプログラム
* GP3がHIGHの間、ビットシフトレジスタSN74HC595Nの点滅制御を行う
*/
//include
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
// PIC12F683コンフィグレーションビット設定
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Detect (BOR enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
// クロック周波数指定
#define _XTAL_FREQ 1000000
//接続するLED数
#define LEDQTY 8
/*
* main()関数
*/
int main(int argc, char** argv) {
// PIC初期化
OSCCON = 0x40; //クロック周波数を1MHz
ANSEL = 0x00; //全てデジタルモード
TRISIO = 0x00; //GP3以外を出力ピンに設定(GP3は入力固定)
//カウンタ変数
int j,k;
//データ定義
int LEDptn[LEDQTY]={0,0,0,0,0,0,0,0};
while(1){
if(GP3==1){ // GP3がHIGHの間点滅
// カウンタの位置のLEDをHIGHにしてループ
// (シフトレジスタに書き込み)
for(j=0;j<LEDQTY;j++){
LEDptn[j]=1;
for(k=0;k<LEDQTY;k++){
GP2=0; //SRCLK LOW
GP0=LEDptn[k];
GP2=1; //SRCLK HIGH
}
GP1=1; //ストレージレジスタに複写
__delay_ms(100); //0.1sec待つ
}
// 前部点灯したらすべてLOWにして全消灯
for(j=0;j<LEDQTY;j++){
LEDptn[j]=0;
for(k=0;k<LEDQTY;k++){
GP2=0;
GP0=LEDptn[k];
GP2=1;
}
}
GP1=1; //ループ内でGP1をHIGHにすると
//1つずつ消えてしまうのでループ外で
//行う
__delay_ms(100);
}
else{ //GP3がLOWの時、全消灯
for(j=0;j<LEDQTY;j++){
LEDptn[j]=0;
for(k=0;k<LEDQTY;k++){
GP2=0;
GP0=LEDptn[k];
GP2=1;
}
}
GP1=1;
__delay_ms(100);
}
}
}
defineで定義したデータの配列を永遠と書こうとおもったのですが、PICの変数用メモリが全然足りなくてエラーが発生しました。なので、今回は単純なロジックで1個ずつ点灯させるようにしました。
以前、Cコンパイラの無償版だと配列に制限がある。。とブログに書いた事がありますが、もしかしたらこの制約のせいだったのかも知れません。
ビジュアル的にLEDの点滅具合がコーディングできなさそうなので、大きな整数値をビット演算子を用いて0,1で取り出す。。みたいなことをしないといけないかも。案外めんどくさい課題になりそうです。
動画
細かい解説はしませんでしたが、雰囲気だけ共有できないかと、動画にしてみました。
コメント
こんばんは!
お〜!すごいすごい!
wi-fi経由で動いていますね〜!すごいです!
私もwi-fi経由でiphoneでの操作をしたいな〜と思ったのですが、肝心のiphone側のアプリの製作が難しそうで挫折してしまいました^^;
やはり赤外線リモコンが簡単なのでそちらで行こうかなと思っています^^;
>6jiroさん
おはようございます!
ラズパイで赤外線リモコンのアプリ開発も考えたんですが、学習させるのがすごい面倒くさそう(笑)なので、手っ取り早いこちらにしました。
ズバリ、見掛け倒しでしょう!w
個人的には、ラズパイからPICを制御できて、それから伸ばしたシフトレジスタが連動させるところのサンプルなど無くて、理論を踏まえて実現できたところが大きいです。
Web側のインタフェースは、HTMLとJavascript、JQueryの知識があれば結構なデザインの操作パネルができると思うので1年後くらいにトライしたいと思います~。