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]」を二重にするとかえって混乱するので、これは共通とした。

以下がその最初のプログラム「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日記」トップに戻る