NanoPi NEOでi2cを使ってみる | Tamesuke-Goto Maker的Blog

Tamesuke-Goto Maker的Blog

地域ISP管理者だけれど、ここ3年ほどMakerなJobが増えたのでまとめてみたいと思います 旧ハンドル Ringoro

続いてi2cのテストをしてみました。
 
NanoPi のOSにはデフォルトで i2cdetect が実装されいていました。
 

で、i2cdetect -y 1 とかやると

 

Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory

 

となります。i2cをイネーブルにしなければなりません。

 

NanoPi設定のために RaspberryPiのraspi-config の代わりに

 

npi-config

 
があります。これを起動しますとお馴染みの画面が出てきました。ここで "Advance Options"を選びます
 
 
ここで i2cデバイスを選びますが、 Raspberry Piと違い3つのデバイスが出てきます。NanoPi NEOで使用できる i2cデバイスは 0番だけですのでここでは i2c0をenableにして下さい。
 
 
 
これで再起動しますと i2c-0 のデバイスが利用できるようになります。ここで
 
i2cdetect -y 0 
 
を実行すると、、、i2cデバイスのリストが出てきますが、なんか表示遅いです。間違ったi2cデバイスをつないでBUSがコリジョンを起こしている状態と同じ様です。
どうもNanoPiではi2cデバイスの端子はPullUpがされてないのが原因ではないかと思われました。
ここで何かi2cデバイスを接続すればよいので、以前秋月で購入した温湿度センサ HDC1000モジュールがあったのでこれをつないでみることにします。このモジュールはピン配置がRaspberry Piのi2cにそのまま挿さる様な並びになっていて便利です。
ただ残念ながらこのHDC1000は販売停止です。代わりにSHT31というモジュールになっています。
 
{8FCB2BE9-5592-4794-838B-3CBB3957C8FF}
 
接続してic2detect を取ると、、、
 

root@NanoPi-NEO:/root/devel# i2cdetect -y 0

     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: -- -- -- -- -- -- -- --                         

 

出ました。
 
次にHDC1000を使って温湿度を測って見ます。 
HDC1000のRaspberryPi用 python計測スクリプトがネットにありましたのでそれを流用します。このスクリプトは smbusライブラリを用いますので、まずインストールして下さい。
 

 apt install python-smbus

 
 
以下のソース hdc1000.py をnanoエディタで入れます。
 
--------------------

 

# HDC1000 read  from RaspberryPi

 

 

# Distributed with a free-will license.

# Use it any way you want, profit or free, provided it fits in the licenses of its associated works.

# HDC1000

# This code is designed to work with the HDC1000_I2CS I2C Mini Module available from ControlEverything.com.

# https://www.controleverything.com/content/Temperature?sku=HDC1000_I2CS#tabs-0-product_tabset-2

 

import smbus

import time

import datetime

 

# Get I2C bus  NanoPi NEO = 0

bus = smbus.SMBus(0)

 

# HDC1000 address, 0x40(64)

# Select configuration register, 0x02(02)

#               0x30(48)        Temperature, Humidity enabled, Resolultion = 14-bits, Heater on

bus.write_byte_data(0x40, 0x02, 0x30)

 

# HDC1000 address, 0x40(64)

# Send temp measurement command, 0x00(00)

bus.write_byte(0x40, 0x00)

 

time.sleep(0.5)

 

# HDC1000 address, 0x40(64)

# Read data back, 2 bytes

# temp MSB, temp LSB

data0 = bus.read_byte(0x40)

data1 = bus.read_byte(0x40)

 

# Convert the data

temp = (data0 * 256) + data1

cTemp = (temp / 65536.0) * 165.0 - 40 -4

fTemp = cTemp * 1.8 + 32

 

# HDC1000 address, 0x40(64)

# Send humidity measurement command, 0x01(01)

bus.write_byte(0x40, 0x01)

 

time.sleep(0.5)

 

# HDC1000 address, 0x40(64)

# Read data back, 2 bytes

# humidity MSB, humidity LSB

data0 = bus.read_byte(0x40)

data1 = bus.read_byte(0x40)

 

# Convert the data

humidity = (data0 * 256) + data1

humidity = (humidity / 65536.0) * 100.0

 

today = datetime.datetime.today()

 

# Output data to screen

 

print today.strftime("%Y/%m/%d %H:%M:%S")

print "Temperature : %.2f C" %cTemp

print "   Humidity : %.2f %%" %humidity

 

 

#print "Temperature in Fahrenheit : %.2f F" %fTemp

 

--------------------

pythonで実行しますと温湿度が取れます。
HDC1000の計測値はCPUボードのすぐ近くにあるためか高めに出てしまいますが、正常に動いているのが確認できました。
 

root@NanoPi-NEO:/root/devel# python hdc1000.py 

2017/10/13 23:50:23

Temperature : 29.12 C

   Humidity : 49.02 %