はじめての F (⋈◍>◡<◍)。✧♡ ~ Pythonプログラム編① ~
はじめての F (⋈◍>◡<◍)。✧♡ ~ RasPi編① ~
さ.
今回は 2019年の Donkey Car / AI Car に FRAM を載せたいと思います ^^#
ただ...使い道はこれから ^^; でも ゆくゆく Donkey Car / AI Car の中で使っていきたいので、Python3 で動くこと!
そして、今回はちゃんとコマンドが送れてるのかなど、LabTool を使って波形を見ようと思います。
ではさっそく
2017年 の はじめての F (⋈◍>◡<◍)。✧♡ ~ ハードウェア編 ~
http://miho-diary.hatenablog.com/entry/2017/05/08/120918
を参考に、SOP8 FRAM Device(今回は I2C FRAM) をユニバーサル基板(RasPi Zero ユニバーサル基板)に載せましょう♪
準備!
■ 用意するものっ
(A)
・SOP8 DIP 変換基板 金フラッシュ(9枚入り)
http://akizukidenshi.com/catalog/g/gP-05154/
・連結ソケット(両端オスピン)8P
http://akizukidenshi.com/catalog/g/gP-00264/
・FRAM(今回は MB85RC256V)
https://www.chip1stop.com/view/searchResult/SearchResultTop?keyword=MB85RC256V&partSameFlg=false
(B)
・丸ピンICソケット(8P)
http://akizukidenshi.com/catalog/g/gP-00035/
・RaspberryPi Zero 用ユニバーサル基板
http://akizukidenshi.com/catalog/g/gP-14031/
(C)
※ 次回②で使うことになりそうです
・LabTool
https://www.embeddedartists.com/products/labtool/
・LabTool専用エンクロージャ:なくてもいいよ
https://shop.emergeplus.jp/labtool/
(A) は
『はじめての F (⋈◍>◡<◍)。✧♡ ~ ハードウェア編 ~』を参考に、FRAMをユニバーサル基板で使えるようにしよう!
【完成図:変換基板に搭載されたFRAM】
(B) では、
(A) でできたFRAMを RaspberryPi Zero用ユニバーサル基板に載せていきます。そのまま、Zero基板にハンダしてもいいんですが、せっかくなので、抜き差しでFRAMを取替っこ出来るようにしましょう!
ということで、丸ピンソケットIC を Zero基板にハンダづけすることにします!
【完成図:Zero基板にFRAM搭載】
完成図は RasPi に Zero基板を搭載してしまってますが、搭載する前に、FRAMの配線を行わなければいけません。今回は I2C のFRAMです。
接続するピンは4つ。ピンの足に色付きの丸印がついているピンが対象です。
【図:FRAMだと、どのピンが対象なの?】
でも、今回FRAMは変換基板に載せているので、変換基板のピン/足が対象です。
【図:変換基板だと、どのピンが対象なの?】
変換基板の ピン/足 につけた色付きの丸印の色と、RasPiピン配 につけた色付きの丸印の色をつなぐように配線しよう!
配線が終わったら、Zero基板はRasPiの40ピンにぶすっと挿しておきます。
補足:
端子 A0~A2 について、今回は GND につないでも、つながなくても大丈夫だよ。
以下、データシートの一部抜粋。
【図:端子機能説明 データシートの一部抜粋】
FRAMは認識されるかな?RasPiに電源を入れましょう!
ターミナルソフトで接続し、i2cdetectコマンドで I2Cバス一覧 および それらのアドレスを確認します。
FRAMがいないとき
(env) pi@Donkey-Miho:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
FRAMがいるとき
(env) pi@Donkey-Miho:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
FRAMは 0x50 に違いない!
じゃFRAMメモリへのデータ書き込み、読み出しを試してみよう!
今回は smbus2 を使ってみます。
https://pypi.org/project/smbus2/
別途インストールが必要です。インストールしましょう!
$ pip install smbus2
サンプルプログラムはここのサイトのソースを参考にさせていただきます。
https://www.raspberrypi.org/forums/viewtopic.php?t=209937
の
https://github.com/switchdoclabs/SDL_Pi_FRAM
FRAMサンプルプログラム!
【fram_main.py】
#!/usr/bin/env python3 import sys from I2Cfram import * if __name__ == '__main__': print(" HELLO FRAM ") print("----------------- ") fram = SDL_I2CFRAM(addr = 0x50) for x in range(0,5): value = x print("address = %i writing value = %i" %(x,value)) fram.write8(x,value) print("---------") print("reading first 10 address") for x in range(0,5): print("address = %i value = %i" %(x,fram.read8(x))) print("---framEND---")
【I2Cfram.py】
#!/usr/bin/env python3 import smbus2 import sys from decimal import * class SDL_I2CFRAM(): def __init__(self, twi=1, addr=0x50): self._bus = smbus2.SMBus(twi) self._addr = addr def write8(self, address, data): print("addr =0x%x address = 0x%x data = 0x%x " % (self._addr, address, data)) self._bus.write_i2c_block_data(self._addr,address>>8,[address%256, data]) def read8(self, address): self._bus.write_i2c_block_data(self._addr,address>>8,[address%256]) returndata = self._bus.read_byte(self._addr) print("addr = 0x%x address = 0x%x %i returndata = 0x%x " % (self._addr, address, address, returndata)) return returndata def readB(self, adr): b = self._bus.read_byte_data(self._addr) return b
【実行結果】
今回書けなかったので、次回はちゃんとコマンドが送れてるのかなど、LabTool を使って波形を見ようと思います。