62 | | |
| 62 | == pythonでのテスト == |
| 63 | |
| 64 | 以前、帯名さんがHIDデバイスのテストをした時のドキュメントを参考にしてみる。[[br]] |
| 65 | まずは、FT260の設定を取得してみる。 |
| 66 | |
| 67 | {{{ |
| 68 | oot@beaglebone:~# ipython --nosep |
| 69 | Python 2.7.9 (default, Aug 13 2016, 17:56:53) |
| 70 | Type "copyright", "credits" or "license" for more information. |
| 71 | |
| 72 | IPython 2.3.0 -- An enhanced Interactive Python. |
| 73 | ? -> Introduction and overview of IPython's features. |
| 74 | %quickref -> Quick reference. |
| 75 | help -> Python's own help system. |
| 76 | object? -> Details about 'object', use 'object??' for extra details. |
| 77 | In [1]: import hid |
| 78 | In [2]: h = hid.device() |
| 79 | In [3]: |
| 80 | In [3]: h.open(0x0403, 0x6030) |
| 81 | In [4]: h.set_nonblocking(1) |
| 82 | Out[4]: 0 |
| 83 | In [5]: h.write([0xA1] + [0]*63) |
| 84 | Out[5]: 64 |
| 85 | In [6]: h.read(64) |
| 86 | Out[6]: [] |
| 87 | In [7]: h.write([0xA0] + [0]*63) |
| 88 | Out[7]: 64 |
| 89 | In [8]: h.write([0xA0] + [0]*63) |
| 90 | Out[8]: 64 |
| 91 | In [9]: h.read(64) |
| 92 | Out[9]: [] |
| 93 | In [10]: h.write([0xA0] + [0]*11) |
| 94 | Out[10]: -1 |
| 95 | In [11]: h.write([0xA0] + [0]*63) |
| 96 | Out[11]: -1 |
| 97 | In [12]: h.read(64) |
| 98 | Out[12]: [] |
| 99 | In [13]: h.read(64) |
| 100 | Out[13]: [] |
| 101 | In [14]: h.write([0xA0] + [0]*63) |
| 102 | Out[14]: -1 |
| 103 | In [15]: h.write([0xC0] + [0]*63) |
| 104 | Out[15]: -1 |
| 105 | In [16]: h.close() |
| 106 | }}} |
| 107 | |
| 108 | うまくいかない、、、[[br]] |
| 109 | 色々見ていったところ、取得するデータによって使用する関数が違うらしい。[[br]] |
| 110 | [http://www.ftdichip.com/Support/Documents/ProgramGuides/AN_394_User_Guide_for_FT260.pdf FT260のアプリケーションノート]を見てみると、15ページの{{{4.3 FT260 Report ID List}}}には、 |
| 111 | |
| 112 | |
| 113 | || Report ID || Type || description || |
| 114 | || 0xA0 || Feature || Chip code || |
| 115 | || 0xA1 || Feature || System Setting || |
| 116 | || 0xB0 || Feature || GPIO || |
| 117 | || 0xB1 || Input || Interrupt Status (from UART interface) || |
| 118 | || 0xC0 || Feature || I2C Status || |
| 119 | || 0xC2 || Output || I2C Read Request || |
| 120 | || 0xD0 ~ 0xDE || Input, Output|| I2C Report || |
| 121 | || 0xE0 || Feature || UART Status || |
| 122 | || 0xE2 || Feature || UART RI and DCD Status || |
| 123 | || 0xF0 ~0xFE ||Input, Output || UART Report || |
| 124 | |
| 125 | と書いてあり、{{{Feature}}}へのアクセスは{{{send_feature_report, get_feature_report}}}で行い、{{{INPUT,OUTPUT}}}は{{{write,read}}}で行うらしい。 |
| 126 | |
| 127 | |
| 128 | {{{ |
| 129 | root@beaglebone:~# ipython --nosep |
| 130 | Python 2.7.9 (default, Aug 13 2016, 17:56:53) |
| 131 | Type "copyright", "credits" or "license" for more information. |
| 132 | |
| 133 | IPython 2.3.0 -- An enhanced Interactive Python. |
| 134 | ? -> Introduction and overview of IPython's features. |
| 135 | %quickref -> Quick reference. |
| 136 | help -> Python's own help system. |
| 137 | object? -> Details about 'object', use 'object??' for extra details. |
| 138 | In [1]: import hid |
| 139 | In [2]: h = hid.device() |
| 140 | In [3]: h.open(0x0403, 0x6030) |
| 141 | In [4]: h.get_feature_report(0xA0,13) |
| 142 | Out[4]: [160, 2, 96, 2, 0, 2, 96, 1, 0, 1, 1, 3, 0] |
| 143 | In [5]: h.get_feature_report(0xA1,64) |
| 144 | Out[5]: |
| 145 | [161, |
| 146 | 1, |
| 147 | 2, |
| 148 | 0, |
| 149 | 1, |
| 150 | 1, |
| 151 | 0, |
| 152 | 0, |
| 153 | 1, |
| 154 | 3, |
| 155 | 6, |
| 156 | 1, |
| 157 | 1, |
| 158 | 12, |
| 159 | 1, |
| 160 | 0, |
| 161 | 0, |
| 162 | 0, |
| 163 | 0, |
| 164 | 0, |
| 165 | 172, |
| 166 | 0, |
| 167 | 188, |
| 168 | 0, |
| 169 | 204] |
| 170 | }}} |
| 171 | |
| 172 | これでやっと、FT260にアクセスできることが確認できた。[[br]] |
| 173 | 次にI2C上のスレーブデバイスにアクセス。[[br]] |
| 174 | |
| 175 | 接続しているI2Cデバイスは、[http://www.analog.com/jp/products/analog-to-digital-converters/integrated-special-purpose-converters/digital-temperature-sensors/adt7410.html#product-overview ADT7410]を基板化した、[http://akizukidenshi.com/catalog/g/gM-06675/ 秋月電子 ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール]。 |
| 176 | |
| 177 | FT260開発ボードの3.3V電源と、IO0,IO1を接続した。 |
| 178 | |
| 179 | {{{ |
| 180 | FT260 <-> ADT7410 |
| 181 | 3.3V (JP6-1) VDD |
| 182 | IO0 (JP6-11) SCL |
| 183 | IO1 (JP6-10) SDA |
| 184 | GND GND |
| 185 | }}} |
| 186 | |
| 187 | 温度センサのI2Cアドレスは0x48としておく。 |
| 188 | |
| 189 | {{{ |
| 190 | In [1]: import hid |
| 191 | In [2]: h = hid.device() |
| 192 | In [3]: h.open(0x0403, 0x6030) |
| 193 | In [4]: h.set_nonblocking(1) |
| 194 | Out[4]: 0 |
| 195 | In [5]: h.write([0xC2, 0x48, 0x06, 0x04, 0x00]) |
| 196 | Out[5]: 5 |
| 197 | In [6]: h.read(64) |
| 198 | Out[6]: [208, 4, 13, 88, 128, 0, 50, 0] |
| 199 | }}} |
| 200 | |
| 201 | 先頭2byteはFT260のHIDコマンドヘッダなので、{{{[13, 88, 128, 0, 50, 0]}}}がデータ。[[br]] |
| 202 | 取得するデータ数は4byteだけど、6byteデータが出てくる。多分、HIDヘッダも含めて4byte単位でデータが出てくるのだろう。[[br]] |
| 203 | |
| 204 | ADT7410のデータシートから、{{{[13, 88]}}}が温度データ、次の{{{[128]}}}がStatus、{{{[0]}}}がConfigurationとなっているようだ。[[br]] |
| 205 | Configurationの7bit目が1なら16bit,0なら13bitデータになる。[[br]] |
| 206 | 13bit時のデータは[15:3]が有効なデータなので、計算式は、 |
| 207 | |
| 208 | {{{ |
| 209 | ADC_DEC = ((HSB<<8) | LSB)>>3 |
| 210 | |
| 211 | Positive_Temp[℃] = ADC_DEC /16.0 |
| 212 | Negative_Temp[℃] = (ADC_DEC - 8192)/16 |
| 213 | }}} |
| 214 | |
| 215 | となるらしい。[[br]] |
| 216 | この計算式に当てはめると、{{{LSB=88,HSB=13}}}の場合、{{{26.6875[℃]}}}となる。[[br]] |
| 217 | |
| 218 | 今回は16bitで使いたいので、Configration Registorの7bit目を1にする必要がある。[[br]] |
| 219 | |
| 220 | |
| 221 | |