Raspberry Pi 日記 (part2)
長嶋 洋一
2013年7月4日(木)
この日は3限にゼミの「電子回路講座」があるだけの日ということで、午前中に慎重にケーブルをハンダ付けして(SUACboardのGainerのピンが「P板.com」のミスで左右反対というバグを思い出すのに苦労(^_^;))、以下のようにRaspberry Piの62号機のGPIOコネクタから、SUACboardのGainerソケットに立てたピンとを接続した。
SUACboardの入出力バスラインはPropellerに直結できる3.3Vレベルと設計していて、5V系のデバイスはCMOSのスレショルド(2.5V)以上として3.3Vレベルに対応し、5V系の入力デバイスのバスラインからはビットごとに1kΩの抵抗を入れている。 これにより、3.3V系であるRaspberry Piとは、そのまま接続できることになる。 目標はもちろん、Raspberry Piでも64個のLEDの個別PWM制御であるが、まずはラッチにデジタルデータを書き込んでの表示からである。 Raspberry PiとSUACboardの接続の仕様は以下である。
そこで、Raspberry Pi61号機の15個のLED出力とはポートのアサインが違うので、無駄な流用をせず、SUACboard接続用に、C言語プログラムを書き換えることにした。 データバスのラッチデータは「GPIO_out(int data, int mode)」で共通であるが、拡張ビットの「EXT_out(int data, int mode)」は下位2ビットとMSBは不要であり、同じ関数名では混乱するので、関数名を「Select_out(int data)」と変えて、ラッチバスの「下げ」「上げ」までをセットとした。 Raspberry Piのビン番号の対応を定義した「assign[15]」を二重にするとかえって混乱するので、これは共通とした。
- Raspberry Piの汎用出力ポート(GPIO0-GPIO7)の8ビットを245でバッファして8個の574に入力
- Raspberry PiのEXT2(LSB)からEXT4(MSB)の3ビットで、8個の574をセレクトするアドレス(0-7)を形成
- Raspberry PiのEXT5のビットが、セレクトされた574にデータをラッチするラッチパルス(立ち上がりエッジ)
以下がその最初のプログラム「test.c」である。 ここでは、1列目と5列目の8ビットをインクリメントしてバイナリ表示し(ほとんど肉眼では点灯しっ放し)、それが1巡するたびに2列目と6列目の8ビットをインクリメントしてバイナリ表示し、それが1巡するたびに3列目と7列目の8ビットをインクリメントしてバイナリ表示し、それが1巡するたびに4列目と8列目の8ビットをインクリメントしてバイナリ表示する。
#include <stdio.h> #include <bcm2835.> int assign[15] = {17,18,27,22,23,24,25,4,2,3,10,9,11,8,7}; void GPIO_out(int data, int mode){ int i; mode = mode & 1; // mode=0 : active high / mode=1 : active low data = data & 255; for (i=0; i<8; i++) { bcm2835_gpio_write( assign[i], ( ( (data >>i) & 1) ^ mode ) ); } } void Select_out(int data){ int i; data = data & 7; for (i=0; i<3; i++) { bcm2835_gpio_write( assign[i+10], ( (data >>i) & 1) ); } bcm2835_gpio_write( assign[13], 0 ); bcm2835_gpio_write( assign[13], 1 ); } int main(void) { int i, j, k, l; if (!bcm2835_init()){ printf("GPIO is not found.\n"); return 1; } for (i=0; i<15; i++){ bcm2835_gpio_fsel(assign[i], BCM2835_GPIO_FSEL_OUTP); } for (l=0; l<8; l++) { GPIO_out(0, 0); Select_out(i); } for (l=0; l<256; l++) { GPIO_out(l, 0); Select_out(3); Select_out(7); for (k=0; k<256; k++) { GPIO_out(k, 0); Select_out(2); Select_out(6); for (j=0; j<256; j++) { GPIO_out(j, 0); Select_out(1); Select_out(5); for (i=0; i<256; i++) { GPIO_out(i, 0); Select_out(0); Select_out(4); } } } } bcm2835_close(); return 0; }
YouTube ここで3限となり、ゼミの「Gainer講座」「Arduino講座」をした後に、上のYouTubeを上げたりして、一つの区切りとなった。 そしてRaspberry PiのPWMでなく、さらに修正希望のメイルが届いたおいちゃん作曲に没頭して(しかし結局は納得できず(^_^;))、この日は終わりとなった。 ハンダ付けとプログラミングと作曲、という、脳の異なった領域をそれぞれ駆使した一日であった。
「Raspberry Pi日記」トップに戻る