Recommended
PPTX
[DL輪読会]Pay Attention to MLPs (gMLP)
PDF
【プライム・ストラテジー】ローカルLLMを複数組み合わてみた(インフラエンジニアのためのChatGPT入門LT)
PDF
PPTX
PDF
PPTX
[DL輪読会]物理学による帰納バイアスを組み込んだダイナミクスモデル作成に関する論文まとめ
PDF
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
PDF
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
PDF
Pythonではじめる OpenAI Gymトレーニング
PDF
PPTX
MS COCO Dataset Introduction
PDF
RのffとbigmemoryとRevoScaleRとを比較してみた
PDF
スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...
PPTX
マルチエージェント深層強化学習による自動運転車両の追越行動の獲得に関する研究
PDF
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
PDF
Cartographer と Autoware を用いた自律走行
PPTX
Direct Sparse Odometryの解説
PDF
PDF
PPTX
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
PPTX
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
PDF
PDF
【DL輪読会】NeRF in the Palm of Your Hand: Corrective Augmentation for Robotics vi...
PPTX
SuperGlue;Learning Feature Matching with Graph Neural Networks (CVPR'20)
PPTX
PDF
PDF
OSC Tokyo 2013 Spring JRPUG
KEY
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
More Related Content
PPTX
[DL輪読会]Pay Attention to MLPs (gMLP)
PDF
【プライム・ストラテジー】ローカルLLMを複数組み合わてみた(インフラエンジニアのためのChatGPT入門LT)
PDF
PPTX
PDF
PPTX
[DL輪読会]物理学による帰納バイアスを組み込んだダイナミクスモデル作成に関する論文まとめ
PDF
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
What's hot
PDF
PDF
Autoware: ROSを用いた一般道自動運転向けソフトウェアプラットフォーム
PDF
Pythonではじめる OpenAI Gymトレーニング
PDF
PPTX
MS COCO Dataset Introduction
PDF
RのffとbigmemoryとRevoScaleRとを比較してみた
PDF
スキーマレスカラムナフォーマット「Yosegi」で実現する スキーマの柔軟性と処理性能を両立したログ収集システム / Hadoop / Spark Con...
PPTX
マルチエージェント深層強化学習による自動運転車両の追越行動の獲得に関する研究
PDF
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
PDF
Cartographer と Autoware を用いた自律走行
PPTX
Direct Sparse Odometryの解説
PDF
PDF
PPTX
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
PPTX
DeBERTaV3: Improving DeBERTa using ELECTRA-Style Pre-Training with Gradient-D...
PDF
PDF
【DL輪読会】NeRF in the Palm of Your Hand: Corrective Augmentation for Robotics vi...
PPTX
SuperGlue;Learning Feature Matching with Graph Neural Networks (CVPR'20)
PPTX
PDF
Similar to I2CでRaspberry Piから複数の周辺機器を制御する
PDF
OSC Tokyo 2013 Spring JRPUG
KEY
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
PDF
3台以上のarduinoでのspi通信 2017 07-20
PPTX
PPTX
Lチカで終わらせないArduino シリアル通信 Part2(移行済)
PPT
Raspberry Jam #1 20121229
PDF
Arduinoで遊ぼう #1Processingと連携する
PDF
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
PDF
PPTX
PDF
PPTX
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
PDF
Raspberry pi + piface=home electronics-security
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
PDF
PPTX
PDF
PDF
20191113 python raspberry_pi_gpio
PDF
Big Raspberry JAM TOKYO 2013 Hardware
PPTX
Androidとfpgaを高速fifo通信させちゃう
I2CでRaspberry Piから複数の周辺機器を制御する 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. I2C
SDA(データ)とSCL(クロック信号)の2本と、
図に書かれていないGNDを接続する。
ここまでのおさらい
UART GND, TX, RX
USART GND, TX, RX, CLK
SPI GND, MOSI, MISO, SCLK, SS
I2C GND, SDA, SCL
21
https://ja.wikipedia.org/wiki/I2C
22. 23. 24. 25. 26. 27. 28. Raspberry Piにつなぐ
Raspberry Pi 3のピン番号1, 3, 5, 9がそれぞれ
3.3V、SDA1、SCL1、GNDなのでそこへつなぐ
28
奥に3本あるのは本題と関係ない。6, 8, 10がGND, TX, RXで、PCからUSB-UARTを使って
シリアルコンソールに接続して作業している。
29. i2cdetect
つながっている周辺機器のアドレスがわかる
(液晶が3e、温度センサが48)
29
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
30. ソースコード
30
https://gist.github.com/nishio/6892f3de5d8b54153212c51f5e21f772
import smbus
from time import sleep
bus = smbus.SMBus(1)
addr = 0x3e
# initialization
data = [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c, 0x38,
0x0c, 0x01]
wait = [1, 1, 1, 1, 1, 400, 1, 1, 2] # ms
for d, w in zip(data, wait):
print 'write', hex(d), 'wait', w, 'ms'
bus.write_byte_data(addr, 0b00000000, d)
sleep(w / 1000.0)
def cls():
bus.write_byte_data(addr, 0b00000000,
0b00000001)
char_table = {}
for i, c in enumerate('0123456789'):
char_table[c]= 0b00110000 + i
char_table['.'] = 0b00101110
def write(s):
for c in s:
bus.write_byte_data(addr, 0b01000000, char_table[c])
def write_deg_mark():
bus.write_byte_data(addr, 0b01000000, 0b11011111)
bus.write_byte_data(addr, 0b01000000, 0b01000011)
def get_temp():
addr = 0x48
v0, v1 = bus.read_i2c_block_data(addr, 1, 2)
temp = ((v0 << 8) + v1 >> 3) / 16.0
return "%2.1f" % temp
if __name__ == '__main__':
while True:
cls()
write(get_temp())
write_deg_mark()
sleep(0.5)
31. 32. 33. 34. 35. 36. 37. 38. 39. ボーレートを下げる
$ sudo modprobe -r i2c_bcm2708
$ sudo modprobe i2c-bcm2708 baudrate=100
$ dmesg # 確認
[ 8.506891] bcm2708_i2c 3f804000.i2c: BSC1
Controller at 0x3f804000 (irq 79) (baudrate
100000)
[ 436.079216] bcm2708_i2c 3f804000.i2c: BSC1
Controller at 0x3f804000 (irq 79) (baudrate 3814)
3814Baudまでしか下がらないみたい。
39
40. 41. 2回やって比較してみる
41
take 1
01001000
H__HH_H_HH_H_H_H_H
__HH_____HHH______
00000000 10
_H_H_H_H_H_H_H_H_HH _H_H
__________________H HH__
01001000 10
_HHH__HH_H_H_H_H_H_H _H_H
__H__HH_____HH______ HH__
00001100
_H_H_H_H_H_HH_H_H
________HHHH_____
11001000 10
_H_H_H_H_H_H_H_H _H_HH
HHHH____HH______ HH__H
take 2
1001000
__H_H_H_H_H_H_H
_HH____HH______
00000000 01
_H_H_H_H_H_H_H_H _H_H
________________ __HH
0 01001000 10
_H _HHH__H_H_H_H_H_H_HH _H_H
__ __H__HH____HH______H HH__
00001101
_H_H_H_HH_H_HH_H_HH
________HHHHH___HH_
00010000 10
_H_H_H_HH_H_H_H_H_H_HH
______HH_________HH__H
42. アドレス48=1001000
42
take 1
01001000
H__HH_H_HH_H_H_H_H
__HH_____HHH______
00000000 10
_H_H_H_H_H_H_H_H_HH _H_H
__________________H HH__
01001000 10
_HHH__HH_H_H_H_H_H_H _H_H
__H__HH_____HH______ HH__
00001100
_H_H_H_H_H_HH_H_H
________HHHH_____
11001000 10
_H_H_H_H_H_H_H_H _H_HH
HHHH____HH______ HH__H
take 2
1001000
__H_H_H_H_H_H_H
_HH____HH______
00000000 01
_H_H_H_H_H_H_H_H _H_H
________________ __HH
0 01001000 10
_H _HHH__H_H_H_H_H_H_HH _H_H
__ __H__HH____HH______H HH__
00001101
_H_H_H_HH_H_HH_H_HH
________HHHHH___HH_
00010000 10
_H_H_H_HH_H_H_H_H_H_HH
______HH_________HH__H
意外なことに2か所あるし
やり取りの長さが違って
「2バイト読むから2回」
ってわけでもなさそうだ。
43. 返り値
43
take 1
01001000
H__HH_H_HH_H_H_H_H
__HH_____HHH______
00000000 10
_H_H_H_H_H_H_H_H_HH _H_H
__________________H HH__
01001000 10
_HHH__HH_H_H_H_H_H_H _H_H
__H__HH_____HH______ HH__
00001100
_H_H_H_H_H_HH_H_H
________HHHH_____
11001000 10
_H_H_H_H_H_H_H_H _H_HH
HHHH____HH______ HH__H
take 2
1001000
__H_H_H_H_H_H_H
_HH____HH______
00000000 01
_H_H_H_H_H_H_H_H _H_H
________________ __HH
0 01001000 10
_H _HHH__H_H_H_H_H_H_HH _H_H
__ __H__HH____HH______H HH__
00001101
_H_H_H_HH_H_HH_H_HH
________HHHHH___HH_
00010000 10
_H_H_H_HH_H_H_H_H _H_HH
______HH_________ HH__H
44. 45. 46. 47. 比較してみる
47
take 1
01001000
H__HH_H_HH_H_H_H_H
__HH_____HHH______
00000000 10
_H_H_H_H_H_H_H_H_HH _H_H
__________________H HH__
01001000 10
_HHH__HH_H_H_H_H_H_H _H_H
__H__HH_____HH______ HH__
00001100
_H_H_H_H_H_HH_H_H
________HHHH_____
11001000 10
_H_H_H_H_H_H_H_H _H_HH
HHHH____HH______ HH__H
take 2
1001000
__H_H_H_H_H_H_H
_HH____HH______
00000000 01
_H_H_H_H_H_H_H_H _H_H
________________ __HH
0 01001000 10
_H _HHH__H_H_H_H_H_H_HH _H_H
__ __H__HH____HH______H HH__
00001101
_H_H_H_HH_H_HH_H_HH
________HHHHH___HH_
00010000 10
_H_H_H_HH_H_H_H_H_H_HH
______HH_________HH__H
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
48. 比較結果
• Write (‘0’)はどこ?
• アドレス後のACKは?
• コマンド後のが01だったり10だったり
…もしかしてコマンド00000000じゃなくて
これの頭の2bitがWriteとACKかも?
• データの間にACKがあるはずでは?
→一部のbitが欠けているのでは
48
49. 並べて書いてみる
49
take 1
0 1001000 0 0
00000010 0
0 1001000 1 0
00001100 0
11001000 1 0
take 2
0 1001000 0 0 # S Addr Wr [A]
000000010 0 # Comm [A]
0 1001000 1 0 # S Addr Rd [A]
00001101 0 # [DataLow] [A]
00010000 1 0 # [DataHigh] NA P
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
あるはずなのにないものを赤字で書いた
→あるはずのACKがないが本当にないのか?
50. 51. 52. 53. 54. 55. 56. アドレス=1001000
アドレス送信後 0 0 00000001 0 0 があって
クロックが長めにHIになる。
ここまでが最初の命令。
56
_____________________HHHHHHHHHHHHHHHHHHHHHH_____________________________________
HHHHHHHHHH______________________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHH
_______HHHHHHHHHHHHHHHHHHHHHH___________________________________________________
HHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH_______
________________________________________________________________________________
____HHHHHHHHHHH___________HHHHHHHHHHH____________HHHHHHHHHHH___________HHHHHHHHH
________________________________________________________________________________
HH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________H
_______________________________________________________HHHHHHHHHHHHHHHHHHHHHH___
HHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHHH___
_________________________________________HHHHHHHHHHHHHHHHHHHHHH_________________
________HHHHHHHHHHH___________HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH______
57. 改めて比較→仕様書通り!
S 1001000 0 0 # S Addr Wr [A]
00000001 0 P # Comm [A]
S 1001000 1 0 # S Addr Rd [A]
00001101 0 # [DataLow] A
01001000 1 P # [DataHigh] NA P
Pのところは「クロックの立ち上がりでSDAを読
む」と0になるが、クロックがLOになる前にSDA
がHIになるので0ではなくP(Stop condition)
を表現しているのだとわかる。
1つ目のPは直後にSが来ることで、合わせて
Repeated Start Conditionだとわかる。
57
58. 59. 60. 61. 62. 63. 付録
Q: スレーブからデータを読むときもマスターが
クロックを発行する? A: Yes
Q: 自分が発行してないクロックに合わせてデー
タを書くとか無茶じゃない?
A: スレーブはクロックがLOになったのを見てか
らデータを書き、マスターはクロックがHIになる
タイミングで読めばよい。
63
HHHHHHHHHHH______________________HHHHHHHHHHHHHHHHHHHHHH_________________________
_HHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___
___________________HHHHHHHHHHHHHHHHHHHHHH_______________________________________
________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHH
______HHHHHHHHHHHHHHHHHHHHHH____________________________________________________
HHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHH_________
_____________HHHHHHHHHHHHHHHHHHHHHH______________________HHHHHHHHHHHHHHHHHHHHHHH
__HHHHHHHHHHH___________HHHHHHHHHHH___________HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
3番目の例はクロックから1サンプル遅れているので因果関係がわかりやすい