ライターのハードが完成しましたので、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
おすすめの記事