ライターのハードが完成しましたので、RaspberryPi(初代機)での制御ソフトを作りたいと思います。
まず初めにRaspberryPiがI2Cを認識するようにセットアップします。
次のコマンドで、vimで /etc/modulesファイルを編集します。
(vimのインストールやvimの使い方はgoogle先生に聞いてみてくださいね^^)
$ cd /etc
$ sudo vim modules
snd-bcm2835
i2c-dev
上記の2行を追加します。
次に/boot/config.txtをvimで編集します。
$ sudo vim /boot/config.txt
dtparam=i2c_arm=on
上記の1行を最後尾に追加 リブートします。
$ sudo reboot
モジュールが追加されたか確認します。
$ lsmod
[bash] Module Size Used by
i2c_dev 5769 0
snd_bcm2835 19496 0
snd_soc_tas5713 5573 0
snd_soc_bcm2708_i2s 6210 0
regmap_mmio 2818 1 snd_soc_bcm2708_i2s
snd_soc_core 128465 2 snd_soc_tas5713,snd_soc_bcm2708_i2s
snd_compress 8259 1 snd_soc_core
regmap_i2c 1661 2 snd_soc_core,snd_soc_tas5713
snd_pcm_dmaengine 5505 1 snd_soc_core
regmap_spi 1913 1 snd_soc_core
snd_pcm 83845 3 snd_bcm2835,snd_soc_core,snd_pcm_dmaengine
snd_page_alloc 5132 1 snd_pcm
snd_seq 55484 0
snd_seq_device 6469 1 snd_seq
snd_timer 20998 2 snd_pcm,snd_seq
leds_gpio 2079 0
led_class 4118 1 leds_gpio
snd 62252 7 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm,snd_seq,snd_seq_device,snd_compress
i2c_bcm2708 4943 0[/bash]
i2c_dev と i2c_bcm2708が登録されました
製作したライターの回路確認した上で(特に電源周りのショートなど)、RaspberryPiに接続します i2cツールをインストールします。
$ sudo apt-get install i2c-tools
i2cでの接続状態を確認します。
$ sudo i2cdetect -y1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
20番、21番の表示がでたら OKです。
pythonでi2cを操作できるように i2cツールをインストールします。
$ sudo apt-get install python-smbus
書き込みできるヘキサファイルは インテルフォーマットで拡張子が .hex または .ihxです。
.ihxは SDCCから コンパイルされたときに生成されるヘキサファイルの拡張子です。
Pythonプログアムは、下記のようになっています。 テキストに張り付けて、ファイル名を
hexwrite.pyとします。 そのあと 実行許可を与えます。
chmod a+x hexwrite.py
書き込みコマンドは次のようになります(例として ヘキサファイル名をtest.ihxとしています)
$ sudo python ./hexwrite.py test.ihx
試作品プログラムなので、虫さんがいるかもしれません。 また確認用のprint文がコメントされています。 それにpythonらしいプログラムになっていないような・・・・^^;
#!/usr/bin/env python
import smbus
import time
import sys
bus = smbus.SMBus(1)
# 16bit i/o i2c interface MCP23017 * 2chip
# DEVICE_ADDR MCP23017 No1
# DEVICE_DATA MCP23017 No2
DEVICE_ADDR = 0x20 #A port >low address :B port >upper address
DEVICE_DATA = 0x21 #A port >data :B port WE OE CE
IODIRA = 0x00
IODIRB = 0x01
OLATA = 0x14
OLATB = 0x15
GPIOA = 0x12
GPIOB = 0x13
GPPUA = 0x0C
GPPUB = 0x0D
# DEVICE_ADDR > setting output
bus.write_byte_data(DEVICE_ADDR,IODIRA,0x00)
bus.write_byte_data(DEVICE_ADDR,IODIRB,0x00)
# DEVICE_DATA > data:output WE,OE,CE:output
bus.write_byte_data(DEVICE_DATA,IODIRA,0x00)
bus.write_byte_data(DEVICE_DATA,IODIRB,0x00)
bus.write_byte_data(DEVICE_DATA,OLATB,0xFF)
# DEVICE_DATA > pull up
bus.write_byte_data(DEVICE_DATA,GPPUA,0xFF)
bus.write_byte_data(DEVICE_DATA,GPPUB,0xFF)
def hexwrite(address, data):
low_addr = 0xff & address
higth_addr = (0xff00 & address) >> 8
#print "Higth_addr:%02x Low_addr:%02x data:%02x" % (higth_addr, low_addr, data)
# data write
bus.write_byte_data(DEVICE_ADDR,OLATA,low_addr)
bus.write_byte_data(DEVICE_ADDR,OLATB,higth_addr)
bus.write_byte_data(DEVICE_DATA,OLATA,data)
# time.sleep(0.1)
bus.write_byte_data(DEVICE_DATA,OLATB,0x7B) #CE >low
# time.sleep(0.1)
bus.write_byte_data(DEVICE_DATA,OLATB,0x7A) #WE >low CE>low
# time.sleep(0.1)
bus.write_byte_data(DEVICE_DATA,OLATB,0x7F) #WE CE > hi
# data read
bus.write_byte_data(DEVICE_DATA,IODIRA,0xFF) #data input mode
# time.sleep(0.5)
bus.write_byte_data(DEVICE_DATA,OLATB,0x7B) #CE >low
bus.write_byte_data(DEVICE_DATA,OLATB,0x79) #CE >low OE >low
read_data = bus.read_byte_data(DEVICE_DATA,GPIOA)
bus.write_byte_data(DEVICE_DATA,OLATB,0x7F) #CE OE > hi
bus.write_byte_data(DEVICE_DATA,IODIRA,0x00) #data output mode
# print "read data:%02x" % ( read_data)
if data != read_data:
sys.exit("read-write check Error:")
if len(sys.argv) != 2 : #command in err
sys.exit("SyntaxError: InputFiles is [python hexwrite Hex_file_name.hex(ihx)]")
if sys.argv[1][-4:] !=".hex" and sys.argv[1][-4:] !=".ihx" : #Extension err
sys.exit("ExtensionError: InputFiles is [python hexwrite Hex_file_name.hex(ihx)]")
f= open(sys.argv[1])
D_hex = f.read()
f.close()
y = D_hex.split('\n')
for i in range(len(y)):
if y[i][0] in ':' :
print y[i]
check_sum = 0
for k in range(1,(len(y[i]) -1),2):
check_sum = check_sum + int(y[i][k] +y[i][k+1],16)
# print "check_sum= %04x " % check_sum
if (check_sum & 0x00ff) <> 0x0000:
sys.exit("Check Sum Error:")
byte_suu=abs(int(y[i][1]+y[i][2],16))
# print byte_suu
address = int(y[i][3]+y[i][4]+y[i][5]+y[i][6],16)
# print hex(address)
record_type=int(y[i][7] + y[i][8],10)
# print record_type
if record_type == 0:
for j in range(9,9+byte_suu*2,2) :
data_byte = int(y[i][j] + y[i][j+1] ,16)
rw_address = address + (j-9)/2
# print "rw_adress: %04x data:%02x" % (rw_adress,data_byte)
hexwrite(rw_address, data_byte)
elif record_type == 1:
print "Hex end blok"
print "OK"
sys.exit()
else:
# print y[i]
# print len(y[i])
# print ord(y[i][0])
if ord(y[i][0]) == 26 :
print "Hex Write End"
sys.exit()
else:
print "NG"
hex(y[i][0])
sys.exit("Error: No Hex Files")
# program end