フォト
2017年8月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

Raspberry Pi

2016年1月19日 (火)

Raspbian Jessie のGPIOまわりの利用権限

Raspbian Jessieで普段使っている アカウント pi の所属グループは、

01

となっていて上記のグループが利用権限を持つディバイスの利用が可能です。

02

もし新たにユーザを登録してそのユーザでGPIOまわりを利用する場合は
そのユーザを各グループに登録すれば利用できるようになります。

ユーザ hoge を グループ dialout に登録するコマンド
$ sudo adduser hoge dialout

他のLinux系だと
$ sudo gpasswd -a hoge dialout

2016年1月 5日 (火)

Raspberry Pi 2でLEDドットマトリックスを制御してみました

以前作成したI2C接続で利用するLEDドットマトリックスをラズパイに繋げて制御してみました。

Dscn4664

I2C接続で制御します。電源は直接ラズパイから供給しています。
4線だけの接続で済みました。

LEDドライバにはHT16K33を利用しています。
HT16K33は、ピン数のことなるバージョンがいくつかあるようですが、
28ピンの8x16の制御ができるバージョンを使っています。





動いている様子


プログラムはC言語で実装しました。GPIOまわりの制御は wiringPiライブラリを利用しました。

// file : matrix.c
// Raspberry Pi 8x16LEDマトリック表示制御 by たま吉さん 2016/1/5
// I2C接続LEDドライバHT16K33を使った8x16のLEDマトリックスを制御する
//

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

#define I2CADR 0x70 // I2Cアドレス

// HT16K33コマンド
#define HT_CMD_DATA 	 	0x00	// データ送信 
#define HT_CMD_SYSSET  		0x20	// システムセットアップ
#define HT_CMD_BLINK	  	0x80	// 点滅表示周期の設定
#define HT_CMD_BRIGHTNESS 	0xE0	// 明るさの設定

// HT16K33 レジスタ設定値
#define HT_SYSSET_OSC_ON	1

// HT16K33 点滅表示周期 設定値
#define HT_BLINK_OFF	    	0
#define HT_BLINK_DISPLAY_ON 	1
#define HT_BLINK_2HZ	    	2
#define HT_BLINK_1HZ	    	4
#define HT_BLINK_05HZ   	6

// グローバル変数
int fd;                		 // I2Cファイルデスクプリタ
unsigned short buf[8];  	// 8x16ドットパターン

// サンプルパターンデータ
char msg_saitama[][8] = { 
	 { 0x08, 0x08, 0x7E, 0x04, 0x24, 0x40, 0x3C, 0x00 },    // さ
	 { 0x00, 0x88, 0x84, 0x82, 0x82, 0x50, 0x20, 0x00 },    // い
	 { 0x20, 0xF0, 0x2E, 0x40, 0x48, 0x50, 0x8E, 0x00 },    // た
	 { 0x08, 0x7E, 0x08, 0x7E, 0x08, 0x7C, 0x7A, 0x00 },    // ま
};

// HT16K33 コマンド送信
void ht_cmd(char cmd, char prm) {
	wiringPiI2CWrite(fd, cmd|prm);
}

// 表示パターンの送信
void ht_update() {
	int i;
	for (i = 0 ; i < 8; i++) {
		wiringPiI2CWriteReg8(fd, i*2,  buf[i] & 0xff);
		wiringPiI2CWriteReg8(fd, i*2+1,buf[i] >> 8);
	}
}

// バッファクリア
void ht_clear_buffer() {
	int i;
  	for (i = 0; i < 8; i++) {
    	buf[i] = 0;
  	}
}

// 表示のクリア
void ht_clear() {
	ht_clear_buffer();
	ht_update();
}

// バッファの指定座標のON/OFF
void ht_set_dot(int x, int y, int d) {
	if (d) {
		buf[y] |= 0x8000 >>x;
	} else {
		buf[y] &= ~(0x8000 >>x);
	}
}

// バッファ上の指定座標に8x8パターンをセット(負座標指定可能)
void ht_write_at(char* p, int x, int y) {
	int i;

	if ((x > 15) || (y > 7) || (x < -7) || (y < -7) ) 
		return;

	for (i = 0; i <8; i++) {
		if ((i+y >= 0) && (i+y < 8) ) {
		   if (x <= 8)
		      buf[i+y] |= p[i]<<(8-x);
		   else
		      buf[i+y] |= p[i]>>(x-8);
		}
	}
}

// 1文字左スクロール挿入
void ht_scrollIn(char* p, int wt) {
	int i,j;
	for (j = 0; j < 8; j++) {
		for (i = 0; i < 8; i++) {
			buf[i]<<=1;
		}
		ht_write_at(p, 15-j, 0);
		ht_update();
		delay(wt);
	}
}

// HT16K33 初期化
void ht_init() {
	ht_cmd(HT_CMD_SYSSET, HT_SYSSET_OSC_ON);
	ht_cmd(HT_CMD_BLINK,  HT_BLINK_DISPLAY_ON | HT_BLINK_OFF);
	ht_cmd(HT_CMD_BRIGHTNESS, 0);
}

// メイン
int main(void) {
	int  i,x,y;

	// GPIO利用のための初期化
	wiringPiSetup();
	// HT16K33の初期化
	fd = wiringPiI2CSetup(I2CADR);
	ht_init();
	
	// デモ
	while(1) {
		// デモ1 ドット表示
		for (i =1; i >=0; i-- ) { 
			for ( y=0; y < 8; y++) {
				for ( x=0; x < 16; x++) {
					ht_set_dot(x,y, i);
					ht_update();
					delay(10);
				}
			}
		}
	  	// デモ2 'さいたま' 表示
		for (i = 0; i <4; i++) {
			ht_scrollIn(msg_saitama[i], 100);  
		}
		delay(500);
		ht_clear();
 	}
 	return 0; 
}

コンパイルは、
$ gcc -o matrix matrix.c -lwiringPi
とします。

美咲フォントを使って、コマンド引数に任意も文字列を指定して表示出来るようにしようと思います。

Raspberry Pi 2(Raspbian Jessie) のGPIOのシリアルポートを使う

Raspberry Pi 2のOSをRaspbian Jessieにアプグレードしました。

2016/04/18 追記
/boot/cmdline.txtの修正について追記しました。

01

ボード上のGPIOのシリアルピンを使う場合、
デフォルトでは1)システムコンソール出力(printk()の出力)と、2)コンソールログイン(getty)に
利用されており、それらに利用されないように設定する必要があります。

1)の対応は、/boot/cmdline.txt の定義を修正します。
具体的には "console=ttyAMA0,115200 kgdboc=ttyAMA0,115200" を削除し、
  dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4
  elevator=deadline rootwait

となります。

ただし、これでもシャットダウンとリブート時等に若干メッセージが出力されるみたいです。
一時的なら/proc/sys/kernel/printk の設定変更でも良いかもしれません(未確認)。

2)は/etc/inittabを開いて修正しようとすると、ファイルがありません。
JESSIEではシステムまわりがsystemdに移行しため、無くなったんですね。

色々と調べ、次のような感じでコンソール(getty)の利用設定が出来るようです。

停止/開始
$sudo systemctl stop serial-getty@ttyAMA0.service
$sudo systemctl start serial-getty@ttyAMA0.service

自動起動の有効/無効
$sudo systemctl enable serial-getty@ttyAMA0.service
$sudo systemctl disable serial-getty@ttyAMA0.service

参考情報
  adafruit RASPBERRY PI - Using UART instead of USB
  Raspberry PIのGPIO上シリアルとArduinoの通信

コンソール(getty)の利用を停止したのち、
シェルプロから直接/dev/ttyAMA0をいじって入出力をする場合、
通信速度や制御コードを送らない設定は従来と同じでsttyコマンドを使います。

$sudo systemctl stop serial-getty@ttyAMA0.service
$sudo chmod o+rw /dev/ttyAMA0
$sudo stty -F /dev/ttyAMA0 115200 \
-iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr \
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig \
-icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase \
-tostop -echoprt -echoctl -echoke

確認として
$cal 2016 > /dev/ttyAMA0

でカレンダーのテキスト文字をTeraTermに送信出来ました。

シェルプロから/dev/ttyAMA0を使う場合は状況に応じて環境変数IFSの設定も必要ですね。
このあたりの話は、以前まとめた下記の記事が参考になると思います。
 ・参考記事 「Linuxで直接シリアルデバイスを利用する際の注意点等」

試しにラズパイにIchigoJamをシリアル接続してIchigoJamのファームウェアの更新を
行ってみたところ、問題なく更新出来ました。
接続
   ラズパイ ピン番号08:GPIO14/TXD(UART0) -> IchigoJam RxD
   ラズパイ ピン番号10:GPIO15/RXD(UART0) -> IchigoJam TxD
   ラズパイ ピン番号06:GND                         -> IchigoJam GND

Dscn4666

更新にはlpc21ispを使いました。
$sudo systemctl stop serial-getty@ttyAMA0.service
$sudo lpc21isp -control -bin ichigojam-xtal.bin /dev/ttyAMA0 115200 12000


USB-UARTモジュール不要なのでこれはこれでお手軽かもしれません。

からソースをダウンロードしてコンパイルしました。
$unzip lpc21isp_197.zip
$cd lpc21isp_197
$make
$sudo cp lpc21isp /usr/local/bin

systemdについては、まだ理解出来ていませんが、下記のサイトのスライドを見て概要は理解出来ました。
  「Linux女子部 systemd徹底入門」  http://www.slideshare.net/enakai/linux-27872553

systemdまわりが理解出来たら、自宅のCenOSサーバーも6から7にアップグレードしようと思います。

2015年7月 1日 (水)

Raspberry Pi 2で 「鬼畜王ランス」を動かしてみる

Raspberry Pi 2が予想以上に高性能で、デスクトップ環境でかなり利用できそうです。
当初の電子工作用用途から、方向がずれて利用しています。

アリスソフトが「配布フリー宣言」と称して公開している「畜生王ランス」をRasberry Piで動かしてみました。
※ 一応、18禁ゲームなので18歳未満はご注意願います。

Rasberry Pi 2で利用できる、アリスソフトのゲームエンジン System3.5が既に用意されています。
それをインストールして、別途「畜生王ランス」をダウンロードして動いちゃいました。

05

音は鳴らないですが、取りあえずプレイは出来ます。

06

表示等も問題なさそうです。

07_2

一応、環境等の設定を以下に記載します。

・ゲームエンジン、フォントのインストール
  $sudo apt-get install xsystem35  fonts-ipafont fonts-ipaexfont

  もしらしたら、リポジトリの追加しないとだめかも知れません。
  私の環境では/etc/apt/sources.list に次の1行を追加しています。
    deb http://ftp.jaist.ac.jp/raspbian wheezy main contrib non-free rpi

  ユーザーのホームディレクトリで、設定ファイル .xsys35rc を新規作成して下記の
  定義を行います。

  font_device: ttf
  ttfont_mincho: /usr/share/fonts/truetype/fonts-japanese-mincho.ttf
  ttfont_gothic: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf

・鬼畜王ランスのダウンロードと解凍
  下記のサイトからダウンロードします。
    アリスソフト アーカイブズ http://retropc.net/alice/menu.html
  KICHIKU_WIN.RAR を解凍し、DAEMON Toolsなどを使ってイメージファイルを
  マウントして中にあるGAMEDATAフォルダをRasberry Pi 2に持っていきます。

イメージファイルごと持っていてRasberry Pi 2でマウントの可能だと思われますが、
今回は取りあえず、必要最低限ファイルのみでのプレイです。 

・ゲームのプレイ
ターミナルを開き、フォルダGAMEDATAに移動後、コマンドxsystem35を実行します。

もっと、色々とやれば音等も出せると思います。

「鬼畜王ランス」は、既にChromeのアプリケーションとして動くらしいのでそちらも後で試してみます。

Raspberry Pi - Xming(Xサーバー)を試してみました

Raspberry Piをリモートで利用したいと思い、Windows 8.1にXmingをインストールして、
リモートデスクトップ環境を試してみました。

Xウィンドウシステムの利点を生かして、マルチユーザでのデスクトップが利用可能です。

02

Raspberry Piに異なるユーザーでログインし、それぞれのデスクトップ環境を利用しています。

03

一応、実用レベルですが、Xming若干怪しいです。ログアウトしてログイン画面(lightdm)を
表示する直前でしょうか、Xmingが異常終了してしまいます。

04

VNCを使った方が無難化もしれませんね。

2015年6月27日 (土)

Raspberry PiでLチカ

新しいデバイスを導入した際は、やはりLチカです。
これをやると、脳内に次の一歩へのイメージが構築されます。

Dscn3919

GPIOを制御してLEDを1秒間隔でチカチカさせています。

プログラムの作成は色々と調べた結果、pythonを使うのが一番簡単そうです。
黒猫のデルタさんのHP「Make.」 の記事「[Raspberry Pi]GPIOでLEDの点滅(Python)」
大変参考になりました。

これを手がかりに、pythonのライブラリ 「RPi.GPIO」を使えば色々と出来そうなことが
分かりました。このライブラリで何が出来るかは、
「raspberry-gpio-python Examples」を参照すると分かります。PWM制御も出来るようです。

黒猫のデルタさんのHP「Make.」 には「[Raspberry Pi]GPIOでLEDの点滅(C言語)」
記事でC言語でwiringPiライブラリを使った実装方法も解説しています。
wiringPiライブラリはArduinoに似た関数です。比較的ステップ数の少ない記述で
GPIOの制御が行えます。