PIC12F629 に手を出したという前回の日記から若干時間がった。その間、PIC12F629 で色々遊んでみたが... 基本的にあまり複雑なことをしようと考えないで、電飾制御用の単純なコードを処理するマイコンとして使うことにした。
まず、複雑なことをしようとすると電子的な知識の無さから回路を考えるのに苦労する。そして、実際の電子回路を伴うデバッグはとても面倒。それでもまだ 8pin の PIC12F629 だから何とかなる。だがしかし...
もう少し複雑なことをしたい。
↓
だが PIC12F629 だとピンが足りない。
↓
ピンが多い PIC に手を出す。
こうなると何かにはまる。PIC16F88 とか、ピンが多くて値段も手頃な PIC は福岡でも手に入る。でもこれらには手を出さないことにした。だって、この辺に手を出すとラジコンする時間が無くなるんだもん...
ってことで、前回は F104 のリアの自動点滅するLEDを3ch目(AUX)でオンオフするコードと回路を作った(AUX スイッチ)。今回は TB03、ツーリングカー用の電飾を作る。(ST/AUX スイッチ)仕様は以下。
(1)ヘッドランプ 2灯 x 2(左右) = 4灯
(2)テールランプ 1灯 x 2(左右) = 2灯
(3)ブレーキランプ 1灯 x 2(左右) = 2灯
(4)合計 8灯
(5)ヘッドランプ、テールランプは 3ch目(AUX)でオンオフできる
(6)ブレーキランプはスロットル(ST)が Lo のときに点灯する
合計 8個の LED をさせるので、AUX スイッチより回路は複雑になる。そして、電流のことも考えないといけない。PIC12F629 の I/O ピンで出力可能な電流は 25mA 程度らしい。正直、F104 用の AUX スイッチを作ったときはこの辺をまったく考慮していなかった。素人って怖い。でも、自動点滅型の赤色 LED 1個だから... 20mA 程度かな。足りたんだと思う。
AUX スイッチは F104 以外でも使う予定だし、その場合用の回路も考えておくことにしよう。兎に角、LED たくさん使う場合は PIC12F629 の I/O からの出力にそのままつないではダメで、この場合は「トランジスタ」を使ってあげる必要があるらしい。「トランジスタ」とかなんか本格的な電子工作っぽい。
さて、トランジスタ使った実際の回路の話はまた次回。今回はプログラムのソースコードのお話。
前回の AUX スイッチで成功したコードを元に、改良を加えていこう。
AUX スイッチでは GP3 で受信機の AUX パルス信号を受信し Hi/Lo を判定していた。今回の ST/AUX スイッチでは、その名の通り、ST、ステアリングのパルス信号も見る必要がある。GP3 ここは GP3 の隣、GP4 を使う。そして、GP3 用と GP4 用の wait_lo/wait_hi 関数を作成した。
void wait_lo3()
{
while (1) {
if (!GPIO3) {
__delay_us(100);
if (!GPIO3) break;
}
}
}
void wait_lo4()
{
while (1) {
if (!GPIO4) {
__delay_us(100);
if (!GPIO4) break;
}
}
}
void wait_hi3()
{
while (1) {
if (GPIO3) break;
}
}
void wait_hi4()
{
while (1) {
if (GPIO4) break;
}
}
wait_lo 関数で 100us 以上の Lo を待ち、それがあったら今度は wait_hi 関数で Hi(パルスの立ち上がり)を待つ。そして、Hi の間隔を見て、出力ピンの出力をオンオフさせてあげる。AUX を処理したら ST を処理して、それが終わったら AUX を... このように交互に処理させてあげることにする。最適化がない HI-TECH C の Lite Mode だと同じループ内でふたつの処理をさせない方が楽と思う。
unsigned char aux;
~略~
while (1) {
if (aux) {
// aux 処理
~略~
} else {
// st 処理
~略~
}
// aux 変数を反転させる
aux = aux ^ 1;
}
こんな感じ。これはこれで動く。最初はこれで動かしてた。でも、これだと AUX と ST と、両方のパルス信号を確実に入力してる場合にしか動作しない。気分的にブレーキランプはいらないな... と思って ST 側のコネクタを外すと... 繋がってない ST 側の Li をずっと待ってしまう。このコードだとループの最初が AUX 側の処理なので、受信機の電源をオンにしたときに送信機の AUX が Hi の状態だとヘッドランプとテールランプが点灯した状態で ST の無限ループに入ってしまう。
まあ、これは「仕様です。」としてもいい内容かも知れない。が、何となく気になるので wait_ 関数を以下のように変更する。
#define LO_TIMEOUT 200
#define HI_TIMEOUT 200
unsigned char wait_lo3(void)
{
unsigned int i = 0;
while (1) {
if (!GP3) {
__delay_us(100);
if (!GP3) return 1;
return 0;
}
i++;
if (i >= LO_TIMEOUT) break;
}
return 0;
}
unsigned char wait_hi3(void)
{
unsigned int i = 0;
while (1) {
if (GP3) return 1;
i++;
if (i >= HI_TIMEOUT) break;
}
return 0;
}
// ※GP4用も同じく作る
まあ、ループにタイムアウトを設けてやればいいのよね。定数で定義しているタイムアウトの数字は PIC のクロックに応じて変更してあげた方がいい。例えば PIC12F683 の 8MHz を使うなら倍とか。4MHz で大体 2~3ms くらいでタイムアウトする。それくらいの速度で AUX と ST の監視を切り替えるようにした。MPLAB のプロジェクト付きソースコードは以下。
「sw_ta.zip」をダウンロード
このコード、とりあえず動く。コメントたくさん書いてるので見ればなんとなく理解できると思われる。ちなみに、このプログラムを使った基盤は既に作成済みでTB-03 用に新しく作った HSV-010(GT-500) のボディに搭載されている。3ch 目でヘッドライトオンオフできる市販パーツってあまりないので、個人的にかなり満足している。(このボディはホンダなのにフェラーリカラーという謎仕様になっているので今度写真アップする。)
...次回に続く。
最近のコメント