At the hackathon, I decided to utilize the Raspberry Pi and camera, Grove Pi + starter kit, and kintone, and investigated the setup and initial settings of the Raspberry Pi. As a result, although there was a problem with the setting to use OpenCV with Python 3 and the Grove Pi + setting, I was able to set the Raspberry Pi and camera, Grove Pi + starter kit, and Python library to access kintone.
The latest Raspberry Pi 4 is not included in Grove Pi support, so I'm using Raspberry Pi 3 this time. The Raspberry Pi 4 is expensive in the first place, so you won't need that much specs for this application.
You can buy them all on Amazon and try them for around 20,408 yen.
Raspberry Pi3 Model B Board & Case Set 3ple Decker Compatible (Clear)-Physical Computing Lab (6,100 yen) https://www.amazon.co.jp/dp/B01CSFZ4JG/ SanDisk microSDHC ULTRA 16GB 80MB / s SDSQUNS-016G Class10 (465 yen) https://www.amazon.co.jp/dp/B074B4P7KD/ __Grove Pi + Starter Kit Raspberry Pi A +, B, B + & 2,3 applicable for beginners CE certification __ (6,100 yen) https://www.amazon.co.jp/dp/B07H9PFWHW/ __US Power Adapter On / Off Switch Cable 5V 2.5A Compatible with Raspberry Pi 3 Lightweight and convenient to carry __ (464 yen) https://www.amazon.co.jp/dp/B07CYNGG4C/ __Camera module Photosensitive chip OV5647 Sensor 5M pixel Raspberry Pi 1 2 3 Model B B A + compatible __ (780 yen) https://www.amazon.co.jp/dp/B07G572B3R/
I downloaded the latest OS from the following. https://www.raspberrypi.org/downloads/raspbian/
The OS image used is as follows. Raspbian Buster with desktop ・ Version: September 2019 ・ Release date: 2019-09-26 -Kernel version: 4.19
The method of setting up the OS on the SD card is omitted. If you want to know more, please refer to the following.
__Raspberry Pi Initial setting Windows (@ sigma7641) __ https://qiita.com/sigma7641/items/995c7bb07eab408b9d0e __Raspberry Pi Initial setting Mac (@skkojiko) __ https://qiita.com/skkojiko/items/a7e342a8ab53b409fe6a
Work is done on the command line, connecting with ssh. The command line text editor is explained in nano, but see below for how to use it.
__GNU nano mastery (@snct_hu) __ https://qiita.com/snct_hu/items/971d512c26dd8b3a3b3c
First of all, set a fixed IP to make it easier to connect with ssh.
$ sudo nano /etc/dhcpcd.conf
(Change the IP address to an appropriate content and add the following settings)
interface eth0
static ip_address=192.168.0.111/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8
Refer to the following for wireless LAN settings. __ Raspberry Pi wireless LAN settings on the command line (@mym) __ https://qiita.com/mym/items/468d2cdb30d756b6df24
Basic OS settings are made using raspi-config.
$ sudo raspi-config
This time, the following is set.
1 Change User Password
4 Localisation Options -> I1 Change Locale -> ja_JP.UTF-8 UTF-8 -> I2 Change Timezone -> Asia -> Tokyo -> I3 Change Keyboard Layout-> Appropriate -> I4 Change Wi-fi Country -> JP Japan
5 Interfacing Options -> P1 Camera -> Enable -> P4 SPI -> Enable -> P5 I2C -> Enable
8 Update
After setting, update the OS to the latest state.
$ sudo apt-get update
$ sudo apt-get upgrade
See below for Raspberry Pi camera settings.
__Raspberry Pi Take photos and videos with your camera __ https://iotdiyclub.net/raspberry-pi-using-camera-1/
After completing the basic settings, configure the settings for Python's OpenCV (image editing library).
$ sudo modprobe bcm2835-v4l2
$ sudo nano /etc/modules
bcm2835-v4l2
$ sudo apt-get install libopencv-dev python-opencv
See below for more information on OpenCV.
OpenCV https://opencv.org/ __ Python version of OpenCV basics __ https://cvtech.cc/py-opencv/ __ Image processing introductory course: Image processing starting with OpenCV and Python __ https://postd.cc/image-processing-101/
When using Python3, make the following settings.
$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev
$ pip3 install opencv-python
If you use OpenCV as it is in Python3, an error will occur in import cv2. To avoid this error, add the library to load.
$ nano .bashrc
export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1
$ source .bashrc
Please refer to the following for installing Grove Pi + on Raspberry Pi. GrovePi+ https://www.switch-science.com/catalog/2129/
Refer to the following for setting the Grove Pi + software. Setting Up The Software https://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/setting-software/
$ curl -kL dexterindustries.com/update_grovepi | bash
$ sudo reboot
$ cd /home/pi/Dexter
$ git clone https://github.com/DexterInd/GrovePi
$ cd /home/pi/Dexter/GrovePi/Script
$ sudo chmod +x install.sh
$ sudo ./install.sh
If there is no problem after installation, you can check the I2C port 04 as shown below with the i2c detect command.
$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
After setting GrovePi +, apt-get upgrade, which updates the OS and installed software, causes a problem with the package dependency and causes an error. To avoid this error, do the following:
$ sudo apt-get --fix-broken upgrade
To test if it works, wire the included Grove LED to the Grove Pi + D4 port as shown below. http://wiki.seeedstudio.com/Grove-Red_LED/#play-with-raspberry-pi-with-grovepi_plus
After wiring, test the following version display and LED blinking to see if there are any problems.
$ python /home/pi/Dexter/GrovePi/Software/Python/grovepi.py
library supports this fw versions: 1.3.0
$ python /home/pi/Dexter/GrovePi/Software/Python/grove_led_blink.py
This example will blink a Grove LED connected to the GrovePi+ on the port labeled D4.
If you're having trouble seeing the LED blink, be sure to check the LED connection and the port number.
You may also try reversing the direction of the LED on the sensor.
Connect the LED to the port labele D4!
LED ON!
LED OFF!
LED ON!
LED OFF!
LED ON!
LED OFF!
As of 02/02/2020, there is a problem with the following Grove Pi + library 1.3.0 files, and many samples do not work. /home/pi/Dexter/GrovePi/Software/Python/grovepi.py https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grovepi.py
For example, grove_button.py is a program that displays button OFF with 0 and button ON with 1, but when executed, the display will be as follows.
$ python /home/pi/Dexter/GrovePi/Software/Python/grove_button.py
255
255
255
255
255
255
There is a problem in the I2C reading part of __grovepi.py and it needs to be fixed. __ The modified part of grovepi.py is explained below.
Line 227 read_identified_i2c_block () Deleted because the while statement loops forever
grovepi.py
def read_identified_i2c_block(read_command_id, no_bytes):
data = [-1]
data = read_i2c_block(no_bytes + 1)
return data
Line 246 Corrected the number array element number of analogRead ()
grovepi.py
# Read analog value from Pin
def analogRead(pin):
write_i2c_block(aRead_cmd + [pin, unused, unused])
number = read_identified_i2c_block(aRead_cmd, no_bytes = 2)
return number[1] * 256 + number[2]
Line 284 UltrasonicRead () number Correct array element number
grovepi.py
# Read value from Grove Ultrasonic
def ultrasonicRead(pin):
write_i2c_block(uRead_cmd + [pin, unused, unused])
number = read_identified_i2c_block(uRead_cmd, no_bytes = 2)
return (number[1] * 256 + number[2])
Line 320 Corrected number array element number and no_bytes variable value of dht ()
grovepi.py
# Read and return temperature and humidity from Grove DHT Pro
def dht(pin, module_type):
write_i2c_block(dht_temp_cmd + [pin, module_type, unused])
number = read_identified_i2c_block(dht_temp_cmd, no_bytes = 9)
if p_version==2:
h=''
for element in (number[1:5]):
h+=chr(element)
t_val=struct.unpack('f', h)
t = round(t_val[0], 2)
h = ''
for element in (number[5:9]):
h+=chr(element)
hum_val=struct.unpack('f',h)
hum = round(hum_val[0], 2)
else:
t_val=bytearray(number[1:5])
h_val=bytearray(number[5:9])
t=round(struct.unpack('f',t_val)[0],2)
hum=round(struct.unpack('f',h_val)[0],2)
if t > -100.0 and t <150.0 and hum >= 0.0 and hum<=100.0:
return [t, hum]
else:
return [float('nan'),float('nan')]
After the above fix, I did the following and got the expected results.
$ python /home/pi/Dexter/GrovePi/Software/Python/grove_button.py
0
0
1
1
1
0
0
$ pip install pykintone
$ pip3 install pykintone
Set node-red as follows.
$ sudo apt-get install nodered
$ npm install node-red-grovepi-nodes
$ npm install node-red-contrib-kintone
$ sudo systemctl enable nodered.service
$ sudo service nodered start
You can use node-red by accessing http: // Raspberry Pi IP address: 1880 / with a browser. See below for details. __Node-RED Run on Raspberry Pi __ https://nodered.jp/docs/getting-started/raspberrypi
Set the remote desktop as follows.
$ sudo apt-get install xrdp
$ cd /etc/xrdp/
$ sudo wget http://w.vmeta.jp/temp/km-0411.ini
$ sudo ln -s km-0411.ini km-e0010411.ini
$ sudo ln -s km-0411.ini km-e0200411.ini
$ sudo ln -s km-0411.ini km-e0210411.ini
$ sudo service xrdp restart
You can connect to the remote desktop with the IP address of the Raspberry Pi as follows. See below for details. __ Connect to raspberry pi3 from a Windows computer with remote desktop (@ t114) __ https://qiita.com/t114/items/bfac508504b9a6b7570d
I got an error when I put opencv in python3 with Raspberry Pi [Countermeasure](@ XM03) https://qiita.com/XM03/items/48463fd910470b226f22
Raspberry Pi Projects for the GrovePi. https://www.dexterindustries.com/GrovePi/projects-for-the-raspberry-pi/ https://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/setting-software/
Grove - LED https://www.seeedstudio.com/Grove-Green-LED.html http://wiki.seeedstudio.com/Grove-Red_LED/#play-with-raspberry-pi-with-grovepi_plus
Grove --Button https://www.seeedstudio.com/Grove-Button.html http://wiki.seeedstudio.com/Grove-Button/#play-with-raspberry-piwith-grovepi_plus
Run on Node-RED Raspberry Pi https://nodered.jp/docs/getting-started/raspberrypi
Connect to raspberry pi3 from a Windows computer with remote desktop (@ t114) https://qiita.com/t114/items/bfac508504b9a6b7570d
GitHub icoxfog417/pykintone https://github.com/icoxfog417/pykintone
Fixed a bug in __grovepi.py (after line 227) __ There is a correction in the description part of (Y.K Bug fixes)
grovepi.py
(Omitted)
# Read I2C block from the GrovePi
def read_i2c_block(no_bytes = max_recv_size):
data = data_not_available_cmd
counter = 0
while data[0] in [data_not_available_cmd[0], 255] and counter < 3:
try:
data = i2c.read_list(reg = None, len = no_bytes)
time.sleep(0.002 + additional_waiting)
if counter > 0:
counter = 0
except:
counter += 1
time.sleep(0.003)
return data
# (Y.K Bug fixes)
def read_identified_i2c_block(read_command_id, no_bytes):
data = [-1]
data = read_i2c_block(no_bytes + 1)
return data
# Arduino Digital Read
def digitalRead(pin):
write_i2c_block(dRead_cmd + [pin, unused, unused])
data = read_identified_i2c_block( dRead_cmd, no_bytes = 1)[0]
return data
# Arduino Digital Write
def digitalWrite(pin, value):
write_i2c_block(dWrite_cmd + [pin, value, unused])
read_i2c_block(no_bytes = 1)
return 1
# Read analog value from Pin (Y.K Bug fixes)
def analogRead(pin):
write_i2c_block(aRead_cmd + [pin, unused, unused])
number = read_identified_i2c_block(aRead_cmd, no_bytes = 2)
return number[1] * 256 + number[2]
# Write PWM
def analogWrite(pin, value):
write_i2c_block(aWrite_cmd + [pin, value, unused])
read_i2c_block(no_bytes = 1)
return 1
# Setting Up Pin mode on Arduino
def pinMode(pin, mode):
if mode == "OUTPUT":
write_i2c_block(pMode_cmd + [pin, 1, unused])
elif mode == "INPUT":
write_i2c_block(pMode_cmd + [pin, 0, unused])
read_i2c_block(no_bytes = 1)
return 1
# Read temp in Celsius from Grove Temperature Sensor
def temp(pin, model = '1.0'):
# each of the sensor revisions use different thermistors, each with their own B value constant
if model == '1.2':
bValue = 4250 # sensor v1.2 uses thermistor ??? (assuming NCP18WF104F03RC until SeeedStudio clarifies)
elif model == '1.1':
bValue = 4250 # sensor v1.1 uses thermistor NCP18WF104F03RC
else:
bValue = 3975 # sensor v1.0 uses thermistor TTC3A103*39H
a = analogRead(pin)
resistance = (float)(1023 - a) * 10000 / a
t = (float)(1 / (math.log(resistance / 10000) / bValue + 1 / 298.15) - 273.15)
return t
# Read value from Grove Ultrasonic (Y.K Bug fixes)
def ultrasonicRead(pin):
write_i2c_block(uRead_cmd + [pin, unused, unused])
number = read_identified_i2c_block(uRead_cmd, no_bytes = 2)
return (number[1] * 256 + number[2])
# Read the firmware version
def version():
write_i2c_block(version_cmd + [unused, unused, unused])
number = read_identified_i2c_block(version_cmd, no_bytes = 3)
return "%s.%s.%s" % (number[0], number[1], number[2])
# Read Grove Accelerometer (+/- 1.5g) XYZ value
# Need to investigate why this reports what was read with the previous command
# Doesn't look to be implemented on the GrovePi
def acc_xyz():
write_i2c_block(acc_xyz_cmd + [unused, unused, unused])
number = read_identified_i2c_block(acc_xyz_cmd, no_bytes = 3)
if number[1] > 32:
number[1] = - (number[1] - 224)
if number[2] > 32:
number[2] = - (number[2] - 224)
if number[3] > 32:
number[3] = - (number[3] - 224)
return (number[0], number[1], number[2])
# Read from Grove RTC
# Doesn't look to be implemented on the GrovePi
def rtc_getTime():
write_i2c_block(rtc_getTime_cmd + [unused, unused, unused])
number = read_i2c_block()
return number
# Read and return temperature and humidity from Grove DHT Pro (Y.K Bug fixes)
def dht(pin, module_type):
write_i2c_block(dht_temp_cmd + [pin, module_type, unused])
number = read_identified_i2c_block(dht_temp_cmd, no_bytes = 9)
if p_version==2:
h=''
for element in (number[1:5]):
h+=chr(element)
t_val=struct.unpack('f', h)
t = round(t_val[0], 2)
h = ''
for element in (number[5:9]):
h+=chr(element)
hum_val=struct.unpack('f',h)
hum = round(hum_val[0], 2)
else:
t_val=bytearray(number[1:5])
h_val=bytearray(number[5:9])
t=round(struct.unpack('f',t_val)[0],2)
hum=round(struct.unpack('f',h_val)[0],2)
if t > -100.0 and t <150.0 and hum >= 0.0 and hum<=100.0:
return [t, hum]
else:
return [float('nan'),float('nan')]
(Omitted)
Recommended Posts