Miho's Memory

組込みとアートとまぜまぜ

はじめての 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をユニバーサル基板で使えるようにしよう!

f:id:MihoN:20200726150136p:plain

【完成図:変換基板に搭載されたFRAM】

(B) では、
(A) でできたFRAMを RaspberryPi Zero用ユニバーサル基板に載せていきます。そのまま、Zero基板にハンダしてもいいんですが、せっかくなので、抜き差しでFRAMを取替っこ出来るようにしましょう!
ということで、丸ピンソケットIC を Zero基板にハンダづけすることにします!

f:id:MihoN:20200726151423p:plain

【完成図:Zero基板にFRAM搭載】


完成図は RasPi に Zero基板を搭載してしまってますが、搭載する前に、FRAMの配線を行わなければいけません。今回は I2C のFRAMです。
接続するピンは4つ。ピンの足に色付きの丸印がついているピンが対象です。

f:id:MihoN:20200726153820p:plain

【図:FRAMだと、どのピンが対象なの?】


でも、今回FRAMは変換基板に載せているので、変換基板のピン/足が対象です。

f:id:MihoN:20200726160044p:plain

【図:変換基板だと、どのピンが対象なの?】


変換基板の ピン/足 につけた色付きの丸印の色と、RasPiピン配 につけた色付きの丸印の色をつなぐように配線しよう!
配線が終わったら、Zero基板はRasPiの40ピンにぶすっと挿しておきます。

補足:
端子 A0~A2 について、今回は GND につないでも、つながなくても大丈夫だよ。

以下、データシートの一部抜粋。

f:id:MihoN:20200801224715p:plain

【図:端子機能説明 データシートの一部抜粋】


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

【実行結果】
f:id:MihoN:20200728190316p:plain

今回書けなかったので、次回はちゃんとコマンドが送れてるのかなど、LabTool を使って波形を見ようと思います。