プログラミング Thonny Python
プログラムを作るにはGPIO(General Purpose Input Output)の知識が必要です。2021/6/20thonnyPython開始
GPIO
基盤の右側にある40ピンの端子がGPIOポートです。
1本のピンで動作するものと,複数のピンで連携して仕事をするものがあります。
電源とアースも含まれます。
UARTはパソコンと通信するときに使うシリアル通信です。RS232C
I2Cは短距離の回路内で使用する2線式のシリアル通信です。
SPIは少し距離のあるモジュール間で使われる3線式のシリアル通信です。
GPIO端子
3.3V
SDA
SCL
GPIO2
I2C
GPIO3
5V
5V
GND
GPIO4
GND
GPIO14
GPIO15
UART
TXD
RXD
GPIO17
GPIO18
GPIO27
GND
GPIO22
GPIO23
3.3V
MOSI
GPIO10
GPIO9
GND
GPIO11
SPI
MISO
SCKL
GPIO24
GND
GPIO25
GPIO8
GPIO7
HAT
ID_SD
ID_SD
HAT
GPIO5
GND
GPIO6
GPIO12
GPIO13
GND
GPIO19
GPIO26
GND
GPIO16
GPIO20
GPIO21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
8
9
7
0
2
3
1213
14
3021222324
25
15
16
1
4
5
6
10
11
31
26
27
28
29
Thonny Python
イチゴのマーク☞プログラミング☞Thonny Pythonでプログラムが開始できます。thonnyの日本語はすぐには見つかりません。多分"かわいい"??トニートニーチョッパー?
GPIO
GPIOを使うためにRPi.GPIOを使います。
GPIO.setmode(GPIO.BOARD)
pin番号で指定
GPIO.setmode(GPIO.BCM)
GPIO番号で指定
出力として使用する場合
GPIO.output(channel, GPIO.HIGH) # True , 1 も同義 GPIO.output(channel, GPIO.LOW) # False, 0 も同義
入力として使う場合
channel = 4
GPIO.setup(channel, GPIO.IN)
開放する場合
GPIO.cleanup()#すべて開放
GPIO.cleanup(channel)#channelを開放
GPIOを使うための高精度モジュール pigpio Pythonを起動する前に実行します。
sudo service pigpiod start
しばらく待つとプロンプトに戻ります。
起動時に実行するためには
sudo systemctl enable pigpiod.service
LED点滅
RPi.GPIOをGPIOとして呼びだしてPIM番号を使って出力します(GPIO.BOARD)。
import RPi.GPIO as GPIO#GPIOとしてRPi>GPIOを呼び出す
led_pin = 11#pin番号は11
GPIO.setmode(GPIO.BOARD)#GPIOはpin番号で指定する
GPIO.setup(led_pin, GPIO.OUT)#LED用IOポートは出力
GPIO.output(led_pin, True)#LED点灯
LEDは点灯し続けます。PIOを開放していないので体に悪そうです。GPIO.cleanup()を入れてもう一度実行します。LEDは消えます。
import RPi.GPIO as GPIO
led_pin = 9
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin, False)#LED消灯
GPIO.cleanup()#GPIOすべて開放
LEDチカチカ
RPi.GPIOをGPIOとして呼びだしてGPIO番号を使って出力します(GPIO.BCM)。timeは時間を扱うモジュールです。
for文を使って繰り返します。( )でくくるのではなく,インデントで内容を示します。
import RPi.GPIO as GPIO
import time#時間を扱うモジュール
led_pin = 27
GPIO.setmode(GPIO.BCM)#GPIO番号で示す
GPIO.setup(led_pin, GPIO.OUT)
for i in range(10):#インデント部分を繰り返す(10回)
GPIO.output(led_pin, True)
time.sleep(1)#1秒待機
GPIO.output(led_pin, False)
time.sleep(1)
GPIO.cleanup()
このエディタではプログラム例はインデントがスペースになっているのでこのままでは動きません。空白をすべて取ってインデントをタブにします(スペースでもOKです)。1行空いているところも,詰めてから行を空けます。
pigpio LEDchikachika
pigpioをpiとして呼びだしてGPIO番号を使って出力します。
import pigpio
import time
led_1 = 17
pi=pigpio.pi()
pi.set_mode(led_1,pigpio.OUTPUT)
for i in range(10):
pi.write(led_1,1)
time.sleep(1)
pi.write(led_1,0)
time.sleep(1)
pi.stop
2021/6/20
スイッチ入力
RPi.GPIOをGPIOとして呼びだしてGPIO番号を使って入力します(GPIO.BCM)。
while True:を使ってループにします。抜け出す命令は有りませんエディターのSTOPを使って終了します。
import RPi.GPIO as GPIO
import time
5
button_1 = 5#入力装置の名前を付ける
led_1 = 17
GPIO.setmode(GPIO.BCM)#GPIO番号で示す
GPIO.setup(button_1, GPIO.IN, pull_up_down=GPIO.PUD_UP)#GPIOを入力にする
GPIO.setup(led_1, GPIO.OUT)
while True:#右の数が0で無ければインデント部分を繰り返す
if GPIO.input(button_1):
GPIO.output(led_1, True)
if GPIO.input(button_1) == 0:
GPIO.output(led_1, False)
GPIO.cleanup()
2021/6/22
GPIO.input(button_1)というのはpull_up_down=GPIO.PUD_UP)のUP,DOWNにより押された時1,0が決まります。
ファイル書き込み
f = open('msg.txt', 'w')#新規作成,上書き
f = open('msg.txt', 'a')#新規作成,アペンド(追加)
f = open('msg.txt', 'x')#新規作成,file exists
data="abc123\n"
f.write(data)
f.writelines(['おはよう',data])
f.close()
2021/7/17
ファイルからの読み込み
f=open('msg.txt','r')
data=f.read()
f.close()
数字文字変換
int(数字・文字数字) 数字を整数にします
bin(数字) 数を2進数にします
oct(123) 数を8進数にします
hex(数字) 数を16進数にします
float(数字) 数字の文字列を浮動小数点数に変換
str() 数値を文字列に変換にします
thony python例
print(int(123))
print(int("123"))
print(bin(123))
print(oct(123))
print(hex(123))
print(int(123.456))
print(float(123.456))
print(float('123.456'))
print(str(123))
OLED
2021/6/16
128x64または128x32のLEDがパネルの中に入っている表示装置です。I2Cで動作します。
I2C
I2Cディバイスを使用するためにはRaspberryPiでI2Cをつかえるように設定します。①②どちらかの方法で行います。
①イチゴのマーク☞設定☞RaspberryPiの設定☞窓の中のインターフェースのタグでI2Cを有効のラジオボタンを押します。
②sudo raspi-config
Interfacing Options を選択
I2C を選択
Would you like the ARM I2C interface to be enabled で Yes と選択
再起動
I2Cアドレス
RaspberryPiのコマンドで sudo i2cdetect -y 1 と指示すると
OLEDの存在が表示されます。I2Cディバイスがすべて表示されます。
OLEDは128x32dotありますので,表示のためにはライブラリを使用しないと大変です。ssd1306
OLEDドライバインストール
RaspberryPiのコマンドラインで以下のコマンドを入力すると
sudo pip3 install adafruit-circuitpython-ssd1306
*(git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git)
*(cd Adafruit_Python_SSD130)
数分でインストールが行われます。OLEDのデータとドライバ
です。
OLED用フォントをインストールします。
sudo apt-get install fonts-noto-cjk
とタイプします。
その他のファイル*は必要なさそうです。
*(sudo pip3 install adafruit-blinka)
*(sudo pip3 install pillow)
*(sudo apt-get update)
*(sudo apt-get install libopenjp2-7)
*
*(sudo apt install libtiff5)
プログラム
#OLEDの表示
#拡張
import board
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
#設定
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c)
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
image = Image.new("1", (oled.width, oled.height))
draw = ImageDraw.Draw(image)
font1 = ImageFont.truetype("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",14)
font2 = ImageFont.truetype("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 8)
#表示内容設定
draw.text((0, 0), "やあ,みなさん!", font=font1, fill=255)
draw.text((0, 18), "123ABCabc",font=font2,fill=255)
#表示
oled.image(image)
oled.show()
2021/6/24やっと動きました。
ファイルからの読み込み
#表示内容設定
f=open('msg.txt','r')
data=f.read()
f.close()
draw.text((0, 10), data, font=font2, fill=255)
/home/piにある 'msg.txt' の内容を表示します。
気圧計BMP180
2021/7/8
使用する前にI2Cのアドレスの確認をします。
更にライブラリを導入します。データ表秋月電子BOSCH参照
sudo apt-get update。。。
sudo apt-get install git build-essential python-dev python-smbus。。。
cd ~/。。。
git clone https://github.com/adafruit/Adafruit_Python_BMP.git。。。
cd Adafruit_Python_BMP。。。
sudo python3 setup.py install。。。
cd examples。。。
python3 simpletest.py。。。
なかなか動かなかったのですがPython3で実行するところが大切です。BMP085のドライバを使ってBMP180を動かしているので名前をBMP180にしたいところですが,名前を変えただけでは認識してくれません。もちろん中身も全てBMP180にしています。ドライバを作る仕組みがあるのでしょう。
センスハット
2021/7/23
RaspberryPi4の場合は
sudo nano /boot/config.txt で
hdmi_force_hotplug=1 と書きます。HDMIをつないで起動させます。その後HDMIを外してもHatの操作がVNCでできます。
sudo apt-get update
sudo apt-get install sense-hat
使用法(Python)例
from sense_hat import SenseHat
sense = SenseHat()
sense.show_message("Hello world!")
WiringPiの導入
2021/7/12
WiringPiの導入方法
pip install wiringpi
sudo apt-get install libi2c-dev (--fix-missing)
失敗した場合は( )内を追加して実行します。
sudo apt-get install git-core
確かめるためには以下のコマンドを実行します。
dpkg -l | grep wiringpi
ii wiringpi
と表示してversionを返してきます。
GPIOのコントロールがコマンドでできます。
gpio -v
これでもversion情報が得られます。
gpio -g mode 0 out
gpio -g write 0 1
gpio -g write 0 0
最新版の導入
cd ~/temp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
ARM GCC Compiler
ARM用Cのインストール
GCC
sudo apt-get install gcc GCCのインストール
プログラミング
hello World
c,c++ファイルを作ります。test.c
#include<stdio.h>
int main() {
printf( "Hello World\n" );
return 0;
}
gcc test.c
"a.out"という実行ファイルが同じフォルダの中にできるので,これを開きます。
./a.out
LEDチカチカ
2021/7/21
#include <stdio.h>
#include <wiringPi.h>
#define GPIO17 17
int main(void) {
int i;
wiringPiSetupGpio();
pinMode(GPIO17, OUTPUT);
for(i=0; i<10; i++){
digitalWrite(GPIO17, 0);
delay(950);
digitalWrite(GPIO17, 1);
delay(50);
}
digitalWrite(GPIO17, 0);
return 0;
}
wiringPiをリンクしてコンパイルします。
gcc gpio_test.c -lwiringPi
BMP180
wiringPi用i2c-toolsをインストールします。
sudo apt-get install i2c-tools
bmp180のヘッダとサンプルを導入します。
cd ~/bmp180-c
wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_18/bmp180-c.tar.gz
sudo tar zxvf bmp180-c.tar.gz
cd bmp180-c
sudo nano bmp180test.c プログラムを確かめます。
sudo gcc -Wall -o bmp180 bmp180test.c -lwiringPi -lm
sudo ./bmp180
CTRL+Cで終了します。
データシートからアドレスは 1110111W/R 読込0xEEと書き込み0xEFです。
プログラムは22bitのCalibration coefficientsを読むことから始められます。16bitの0xAAから0xBFです。
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <stdio.h>
#include <math.h>
#include "bmp180.h"
#define OSS BMP180_STANDARD
//データシートに示されている変数
short AC1,AC2,AC3,B1,B2,MB,MC,M;
unsigned short AC4,AC5,AC6;
int fd;
char I2C_readByte(int reg)
{
return (char)wiringPiI2CReadReg8(fd,reg);
}
//I2C 16bit上位読込
unsigned short I2C_readU16(int reg)
{
int MSB,LSB;
MSB = I2C_readByte(reg);
LSB = I2C_readByte(reg + 1);
int value = (MSB << 8) +LSB;
return (unsigned short)value;
}
//I2C 16bit下位読込
short I2C_readS16(int reg)
{
int result;
result = I2C_readU16(reg);
if (result > 32767)result -= 65536;
return (short)result;
}
//I2C Byte書き込み
void I2C_writeByte(int reg,int val)
{
wiringPiI2CWriteReg8(fd,reg,val);
}
//キャリブレーションデータ読込
void load_calibration()
{
AC1 = I2C_readS16(BMP180_CAL_AC1);
AC2 = I2C_readS16(BMP180_CAL_AC2);
AC3 = I2C_readS16(BMP180_CAL_AC3);
AC4 = I2C_readU16(BMP180_CAL_AC4);
AC5 = I2C_readU16(BMP180_CAL_AC5);
AC6 = I2C_readU16(BMP180_CAL_AC6);
B1 = I2C_readS16(BMP180_CAL_B1);
B2 = I2C_readS16(BMP180_CAL_B2);
MB = I2C_readS16(BMP180_CAL_MB);
MC = I2C_readS16(BMP180_CAL_MC);
MD = I2C_readS16(BMP180_CAL_MD);
}
//生温度読込
int read_raw_temp()
{
int raw;
I2C_writeByte(BMP180_CONTROL,BMP180_READTEMPCMD);
delay(5); //5ms;
raw = I2C_readByte(BMP180_TEMPDATA) << 8;
raw += I2C_readByte(BMP180_TEMPDATA+1);
return raw;
}
//生気圧読込
int read_raw_pressure()
{
int MSB,LSB,XLSB,raw;
I2C_writeByte(BMP180_CONTROL,BMP180_READPRESSURECMD +(OSS << 6));
switch(OSS)
{
case BMP180_ULTRALOWPOWER:
delay(5);break;
case BMP180_HIGHRES:
delay(14);break;
case BMP180_ULTRAHIGHRES:
delay(26);break;
default :
delay(8);
}
MSB = I2C_readByte(BMP180_PRESSUREDATA);
LSB = I2C_readByte(BMP180_PRESSUREDATA + 1);
XLSB = I2C_readByte(BMP180_PRESSUREDATA + 2);
raw = ((MSB << 16) + (LSB << 8) + XLSB) >> (8 - OSS);
return raw;
}
//気温読込計算
float read_temperature()
{
float T;
int UT,X1,X2,B5;
UT = read_raw_temp();
X1 = ((UT - AC6)*AC5) >> 15;
X2 = (MC << 11) / (X1 + MD);
B5 = X1 + X2;
T = ((B5 + 8) >> 4) /10.0;
return T;
}
//気圧読込計算
int read_pressure()
{
int P;
int UT,UP,X1,X2,X3,B3,B5,B6;
unsigned int B4;
int B7;
UT = read_raw_temp();
UP = read_raw_pressure();
X1 = ((UT - AC6)*AC5) >> 15;
X2 = (MC << 11) / (X1 + MD);
B5 = X1 + X2;
//Pressure Calculations
B6 = B5 - 4000;
X1 = (B2 * (B6 * B6) >> 12) >> 11;
X2 = (AC2 * B6) >> 11;
X3 = X1 + X2;
B3 = (((AC1 * 4 + X3) << OSS) + 2) / 4;
X1 = (AC3 * B6) >> 13;
X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
X3 = ((X1 + X2) + 2) >> 2;
B4 = (AC4 * (X3 + 32768)) >> 15;
B7 = (UP - B3) * (50000 >> OSS);
if (B7 < 0x80000000){P = (B7 * 2) / B4;}
else {P = (B7 / B4) * 2;}
X1 = (P >> 8) * (P >> 8);
X1 = (X1 * 3038) >> 16;
X2 = (-7357 * P) >> 16;
P = P + ((X1 + X2 + 3791) >> 4);
return P;
}
//高度計算
float read_altitude()
{
float pressure,altitude;
float sealevel_pa = 101325.0;
pressure = (float)read_pressure();
altitude = 44330.0 * (1.0 - pow(pressure / sealevel_pa,(1.0/5.255)));
return altitude;
}
//海面気圧
float read_sealevel_pressure()
{
float altitude_m = 0.0;
float pressure,p0;
pressure =(float)read_pressure();
p0 = pressure / pow(1.0 - altitude_m/44330.0,5.255);
return p0;
}
//メイン
int main(int argc,char *rgv)
{
printf("BMP180 Test Program ...\n");
if(wiringPiSetup() < 0) return 1;
fd = wiringPiI2CSetup(BMP180_Address);
load_calibration();
while(1)
{
printf("\nTemperature : %.2f C\n",read_temperature());
printf("Pressure : %.2f Pa\n",read_pressure()/100.0);
printf("Altitude : %.2f h\n",read_altitude());
delay(10000);
}
return 0;
}
未完2021/7/13
デバイスドライバ開発環境
2021/7/9
sudo passwd rootで新しいパスワードを設定します。暗証番号入力中は何も反応がないのですがenterキーで改行して,再入力を要求されます。
su -と入力すると,パスワードを要求されます。
root@raspberrypi:~#となり,ルートに入ります。
apt-get install git 入力して最新のパッケージを入れます。
cd /usr/src 作業するディレクトリに移動します。
sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
読み込んで展開する許可を求めてきます。y と入力します。
Raspbian “wheezy”のソースコードをダウンロードします。
10分以上の時間がかかります。
ファイル /boot/config.txt の最後の行に
sudo nano /boot/config.txt
# Parameters to boot on raspbian kernel (linux-image-rpi-rpfv package)
kernel=vmlinuz-4.9.4-2-rpi
initramfs initrd.img-4.9.4-2-rpi followkernel
4.9.4-2-rpiは導入したrpiファイルのバージョンによります。
rebootします。
カーネルのバージョンを調べます。
uname -a4.9.4-2
CircuitPython
ThonnyPython の前身のようです。
ラズパイ専用 sensorHAT
センサーハット3号
2021/6/15
あけももさんが販売しているセンサーハットです。SWx2 LEDx2 赤外線受光子 赤外線LED CDS 傾きセンサ 気圧センサ 温湿度センサ 人感センサ 距離センサと盛りだくさんのセンサが乗っているRaspberry Pi 0の大きさのハットです。
センサの測定はPythonで行いNode-Redで表示するそうです。
2021/6/17
組み立てに2日かかるということで勉強をしていたところ,部品の数が少ないHATも販売されていたので,これを先に動かしてみようと購入しました。
これならLED2つとタクトSW2つOLED1つですぐに使えるようになりそうです。
2021/6/15
センサーハットを入手しようとして初めてNode-REDに出会い勉強を始めました。
Node-RED
2021/6/29
用意されたブロックを組み立ててプログラムを作り出せます。とても簡単な方式です。
ラズベリーパイで使うと,各GPIOやI2Cなどの入出力が使えます。
ブラウザで実行することができ,ダッシュボードという視覚的に操作ができるので便利な道具です。パイソンと組み合わせるとかなり実用的なものを作り出すことができます。
2021/6/15
パソコンで使う
Node-REDをラズベリーパイに実装
2021/6/18
ラズパイでNode-RED
Vncで遠隔操作でラズベリーパイを動かすとcopy&pasteなどで便利です。
インストール
イチゴのマークから☞設定☞Recommended Software(推奨されるソフトウエア)に入っています。そのまま使うことはできないようです。
Raspbianリポジトリとしてパッケージが配布されています。
apt-get install によってインストールすることを可能にし, またRaspbianパッケージされたバージョンのNode.jsを含んでいますが,npmは含んでいません。Node-RED User Group Japanでは以下の方法を推奨しています。
イチゴのマークから☞>_ をクリックしてコマンドプロンプトで
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
とタイプすると[y/n]と意思を求められます。yとtypeしてしばらく待ちます。(チャタリングが短く回避されているようなので素早くENTERキーをたたきます。)
Updateを含んでいるScriptなのでしばらくしたらまた実行することもできます。
stop Node-RED ☑n
Remove old version of Node-RED ☑
Remove old version of Node.js ☑
Install Node-js for Armv6 ☑ v14.17.0 Npm6.14.13
clean npm cache ☑
Install Node-RED core ☑ 1.3.5
Move global nodes to local .
Npm rebuild existing nodes ☑
Install extra Pi nodes .
Add shoretcut commands ☑
Update systemd script ☑
30分くらいかかると思います。yとタイプしてから動作していないように見えました。数分すると☑が付くので動作していると確認できます。開始と終了の時刻が表示されますので21分15秒と計算できました。pi4では4分23秒でした。
2021/6/18
コマンドプロンプトでnode-redとタイプすると
18 Jun 14:18:09 - [info] サーバは http://127.0.0.1:1880/ で実行中です
18 Jun 14:18:09 - [info] フローを開始します
18 Jun 14:18:09 - [info] フローを開始しました
と表示されました。
正常にインストールされたようです。
実行
メモリの節約のため
node-red-pi --max-old-space-size=256
と実行させる必要があるようです。
起動時に実行
sudo systemctl enable nodered.service
で起動時にサービスを開始します。
sudo systemctl disable nodered.service
で無効になります。
LEDチカチカ
LEDチカチカをやってみます。
各ノードの設定はダブルクリックして行います。GPIOが可視的に行えます。
RaspberryPiのNode-REDにはGPIO入出力とマウス,キーボードのノードが備わっています。
デジタルピンの使用No.が13と表示されています。出力形式を選ぶことができます。初期レベルも選択できます。名前を付けて分かり易くできます。既に使用されているpinが表示されています。
デジタル入力はプルアップ,ダウンが選べます。
デバウンスはチャタリング(スイッチのこすれ誤差)だと思います。スイッチを入れるときすぐにONになるのではなく,ザラザラと細かくON,OFFを繰り返してからONになります。1を入力したとき100回も1を入力したことになったら,111111111111・・・・・・・・1111,大変なことになってしまいます。マイコンはいくら遅い機械でも,人間のスイッチを押す動作の比べるとはるかに速いのです。1回ONになったら25mSくらい待って安定してから次の動作を確認します。
2021/6/28
ダッシュボード
Dashboardの追加
デプロイの右にある3本線のメニューをクリックしてパレットの管理画面でノードを追加タグをクリックします。
ノードを検索欄でdashboardを検索します。
node-red-dashboard
ノードを追加します。
追加するとノードの欄にdashboardのグループが追加されます。更に右のサイドバーにdashboardの項目が造られ,GUIの部品名が表示されます。
ブラウザで実装RED
パソコンやスマホ,タブレットなどでブラウザ(googleやyahooなど)IEなどで開きます。ブラウザのURL欄にRaspberryPiのIPアドレスhttp://192.168.**.xx:1880/redとタイプするとNode-REDに入ることができます。
ブラウザで確認UI
パソコンやスマホ,タブレットなどでブラウザ(googleやyahooなど)IEなどで開きます。ブラウザのURL欄にRaspberryPiのIPアドレスhttp://192.168.**.xx:1880/uiとタイプするとNode-REDのダッシュボードをが見ることできます。
http://192.168.**.xx:1880/red と http://192.168.**.xx:1880/ui の2つの窓を開けて,交互に参照して実装の様子を確認することができます。
2021/6/29
Dashboardのレイアウト
サイドバーのプルダウンメニューボタンを押すとdashboardが含まれたメニューが出ますので選択します。
ダッシュボードについて3つの編集画面があります。テーマは各パーツなどの配色です。サイトについては表示する項目などについて設定ができます。
配置の画面で各部品の配置の設定ができます。
+グループはデフォルトのようなグループを増やします。
編集は名前の変更などをします。
レイアウトで部品の位置を変えます。
部品の配置が見てわかるようにレイアウトすることができます。幅を5にして配置します。鍵のかかったマークの時は長さや厚みを変えることができます。
ボタンを配置
LED_27が配置されているフローにbuttonを配置します。
buttonノードをダブルクリックします。
鉛筆マークをクリックします。
もう一度鉛筆マークをクリックします。
「ボタン配置」とタイプします。出来たら更新ボタンをクリックします。
もう一度更新をクリックします。
buttonのノードのオレンジ色の三角が無くなり,配置ができました。
名前とPayloadを記めます。名前はON,OFFです。PayloadはPayloadのすぐ右の▼をクリックして数値を選択して,1と0を入力します。
ワークスペースとサイドバーはこのようになっています。
タグの「ボタン」にマウスをホバーすると,
グループ 編集 レイアウトが表示されます。レイアウトをクリックしてレイアウトを見ます。
2つキレイに並んでいます。幅5になっていますので,▲▼で大きさを指定します。
鍵がかかっているマークでは,矢印のところをドラッグすると大きさが変えられます。その他のところをドラッグすると場所を変えることができます。縦の長さは自動で変わります。
このような形と配置にしてみました。完了をクリックしてワークスペースに戻ってノードをダブルクリックして,バックグランドカラーを指定します。Backgroundの赤い丸の中に#ff0000のように#と16進数2桁×3を入力します。RGB(R赤,G緑,B青)の輝度が256段階で指定できます。
ONを#007f00,OFFを#0f0f0fとしました。出来たら,完了を押して,更にデプロイします。
テーマをライトモードとダークモードで実施するとこのようになります。
文字の色も変えることができます。
読み込み,書き出し
2021/7/2
デプロイの右にある三本線メニューに「読み込み」,「書き出し」があります。
書き出しを選択すると
「フローを書き出し」という見出しのシートが出てきます。右下には,「ダウンロード」と「書き出し」があります。ダウンロードは'JSON'ファイルをダウンロードフォルダーに書き出します。
RaspberryPiのスイッチ1つとLED1つのノードをワイヤで繋いだ時のjsonファイルです。
[
{
"id": "a3cc0a12.c7d798",
"type": "tab",
"label": "LEDとボタン配置",
"disabled": false,
"info": ""
},
{
"id": "411fc047.f71f9",
"type": "rpi-gpio out",
"z": "a3cc0a12.c7d798",
"name": "LED1",
"pin": "11",
"set": true,
"level": "0",
"freq": "",
"out": "out",
"x": 430,
"y": 140,
"wires": []
},
{
"id": "a35e1d4d.9ba07",
"type": "rpi-gpio in",
"z": "a3cc0a12.c7d798",
"name": "SW1",
"pin": "29",
"intype": "up",
"debounce": "25",
"read": true,
"x": 260,
"y": 140,
"wires": [ [ "411fc047.f71f9" ] ]
}
]
フローの書き出しはダウンロードすることでできます。名前はダウンロードしてからつけることになります。内容が何かの法則で書かれていますので,解読できそうです。
読込は場所を指定してファイルを選択して読み込むことができます。フォルダーも選択後は固定しているので便利です。
calc
機能
Termux
apt update
apt upgrade
apt install coreutils nano nodejs
pkg install nodejs ***必要?
npm i -g --unsafe-perm node-red
node-red
ブラウザでhttp://localhost:1880と入力???できません。
Red Mobile Lite
アプリストアでRedMobile Liteを入手できます。スタートさせて
RED
Dashboard
Uoload flows
Open Source Licenses
Forum
この部分を軽く左へスワイプします。
Username:
Password:
Port:
1880
KeepAwake 〇〇
AutoStart 〇〇
START ⚡
192.168.**.xx:1880/red
KeepAwake と AutoStart をONにしておくとすぐに
パソコンからIPアドレスを指定して:1880を実行できます。
このディバイスでコーディングをする場合は,IPアドレスの部分を長押しするとエディタが開きます。
スマホやタブレットで実行環境を作ってNode-REDの練習をするのもいいと思います。
ノードの仕様
2021/7/3
Node-REDで使うノードの仕様について書きます。
各ノードの仕様
いろいろなディバイスで使うことができるNode-REDです。機種に依存する部分は特記します。共通で使うノードの仕様について書いていきます。
各ノードの簡単な説明は右側のサイドバーで i 情報のタブで紹介されます。
ノードの追加
左のパレットの中のノードだけではなくサードパーティーの提供するノードがあります。それを追加するためには,右上にあるデプロイアイコンの隣にある三本線のメニューをクリックします。
パレットの管理をクリックして,ユーザ設定画面が開きます。
ノードを追加タグを開きます。ノードの検索欄にノード名の一部または全部を入力すると候補が表示されます。
右端のノードを追加ボタンをクリックすると 中止 ノード情報を参照 追加と表示されますのでクリックします。参照するとノードの説明が表示されます。
追加 をクリックするとノードが追加されます。いらなければ中止です。
各ノードの仕様
共通
2021/7/4
ペイロード 日時(flow,global,文字列,数値,真偽,JSON,
バッファ,日時,環境変数)
繰り返し
名前 任意
各種のデータを送り出します。繰り返しやスイッチがついています。
2021/7/3
サイドバーのデバッグウインドウにメッセージを送り出します。
機能
2021/7/16
return msg; でJAVAスクリプトの返り値を返すことができます。
var num = msg.payload;
msg.payload = num.toString(16);
return msg;
0~255の数字を16進数の文字列に変換します。
var num = msg.payload;
msg.payload = ~~num*100/255;
return msg;
0~255の数字を100までの数に変換します。
var num = msg.payload;
msg.payload = parseInt(num);
return msg;
小数を整数に変換します。
2021/7/4
change
ルール
値の代入 flow today
対象の値 msg payoad
payloadからflowにtodayを抜き出して出力します。
値の置換 msg payload
検索する文字列 temp=
値の置換 □(...空白)
payloadの中の文字列 temp= を 空白に置き換えます。
値の削除 msg payload
文字列 を 削除します。
peyloadからデータを代入,置換,削除,移動してflowに送り出します。
2021/7/3
テンプレート
1 This is the payload: {{payload}} !この部分が変化できます。
テンプレート内の各種データを送り出します。
2021/7/16
テンプレートの中に
好きな果物は {{payload}} !です。
送られてくるペイロードを中に取り込んで文字列を作ります。
2021/7/16
テンプレートの中に
#{{payload}}1f1f
送られてくるペイロード(16進数2桁)を中に取り込んで色文字列を作ります。ボタンノードのbackgroundに入れられます。
2021/7/4
コマンド cat /sys/class/thermal/thermal_zone0/temp
CPU温度を返します。 54321
コマンド vcgencmd measure_temp
CPU温度を返します。 temp=54.3'C
export PATH=”$PATH:/home/pi” pathの追加
/usr/bin/env python3 Python を実行
python3 OLED.py Python プログラムOLED.pyを実行
printenv 環境変数の表示
SHELL=/bin/bash PYTHONUNBUFFERED=1 LANGUAGE=ja_JP.UTF-8 NODE_OPTIONS=--max_old_space_size=1024 PWD=/home/pi LOGNAME=pi HOME=/home/pi LANG=ja_JP.UTF-8 INVOCATION_ID=72c72f42fcca48d987b7c36c28c0e07d USER=pi SHLVL=0 NODE_RED_HOME=/usr/lib/node_modules/node-red JOURNAL_STREAM=8:11255 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin OLDPWD=/usr/lib/node_modules/node-red/bin _=/usr/bin/printenv
export PATH=
”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games”
元のpathに戻す
f = open('myfile.txt', 'r') Pythonでファイルを読み込む
システムのコマンドを実行して出力を返します。
ネットワーク
2021/7/3
メソッド GET
URL hello
名前 任意
webの名前をhelloと付けます。
2021/7/3
URLにデータを送り出します。
ストレージ
OLED
サードパーティーの作品です。
ダッシュボード
ダッシュボードタブでノードを編集の窓で状態が無効になっているとui画面が出てきません
レイアウトができなくなる場合はRaspberryPiを再起動すると直る場合があります。
2021/7/5
四角い押しボタンを作ることができます。
各種の出力をします。optional background colorの欄に{{payload}}と記入するとpayloadに運ばれてきた色#ff0000に変更できます。
injectノードに#ff0000と#00ff00をbuttonノードに送れるようにします。redで変えて,uiで見ます。
2021/7/17
ONの時とOFFの時,数字や文字で出力します。
ラベルを表示をします。
a
2021/7/17
最低と最高の間の数値を出力します。
ラベルを表示をします。
a
2021/7/5
Gauge,Donut,Compass,Levelの形式で数値を視覚化します。
各種の表示をします。
a
2021/7/5
折れ線グラフ.棒グラフ,棒グラフ(横),円グラフ,鶏頭図,レーダーチャートの各グラフを表示します。
各種のグラフの表示をします。
a
2021/7/5
TTS Voice 選択した言語で音声を出力します。
各種言語で音声出力します。
a
RaspberryPi
2021/7/5
RaspberryPiのGPIOのinputに関する設定をします。
使用する端子 図で選択
デジタル出力とPWM出力の選択
PWM出力の場合の周波数
PINの初期値はON,OFF
RaspberryPiの入力の設定です。
a
2021/7/5
RaspberryPiのGPIOのうちoutputに関する設定をします。
使用する端子 図で選択
プルアップ・ダウンの有無
でバウンド(チャタリング防止)時間設定
再起動時状態の読み込み有無
RaspberryPiの出力です。
a
Node-RED User Group Japan ノードの開発
空のワークスペース
[
{
"id": "e5a95b7c.408ff8",
"type": "tab",
"label": "フロー 1",
"disabled": false,
"info": ""
}
]
functionノードを一つ加えたフロー
[
{
"id": "61fe4026.ae3d5",
"type": "tab",
"label": "ノード作成",
"disabled": false,
"info": ""
},
{
"id": "7821d04.ca9213",
"type": "function",
"z": "61fe4026.ae3d5",
"name": "",
"func": "\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 130,
"y": 60,
"wires": [
[]
]
}
]
ノードの作成
/home/pi/Node-RED/node-red-contrib-example-lower-case
というフォルダーを作ります。その中に3つのファイルを作ります。
フォルダーはどのような名前でもいいのですが,node-red-contribがnode-redの公式のノード供給名の頭なのでこの名前にします。
/home/piというのは,フォルダーのマークをクリックすると一番初めに開かれる場所です。
そこに,Node-REDというフォルダーを作ります。
そのフォルダーに入って
node-red-contrib-example-lower-case
という新しいフォルダを作ります。example-lower-caseの名前を変えると他のノードを作るときに混乱しないようになります。
3つのファイル
package.json
lower-case.js
lower-case.html
package.json
このフォルダーで npm init と入力すると
改行されて質問されます。全てenterを押すとpackage.json が作られます。
{
"name": "red-contrib-sample-test1",
"node-red": {
"nodes": {
"yashiTest": "yashiTest.js"
}
},
"version": "0.1.0",
"description": "yashi Node",
"main": "yashiTest.js",
"scripts": {},
"keywords": [
"node-red",
"yashi Node"
],
"author": "yashi",
"repository": {
"type": "git",
"url": ""
},
"license": "Apache-2.0"
}
この中で大切なところを抜き出します。
{
"name": "red-contrib-sample-test1",
"node-red": { "nodes": {
"yashiTest": "yashiTest.js"
}
},
}
分かり易くしてみます。
{
"name" : "Node-RED/node-red-contrib-sample-test1",
...
"node-red" : { "nodes": { "yashiTest": "yashiTest.js" }}
}
""でくくったものは(名詞)名前です。
":" を "は" と読み替えて "," を "です" と読みます。
{
"name"は"Node-RED/node-red-contrib-sample-test1"です
...
"node-red"は{ "nodes"は{ "yashiTest"は"yashiTest.js" }}
}
名前 は フォルダ名 です。
ノードレッド は {ノード は {仕事の名前 は ファイル名}
このノードはフォルダー名の中のノードjsの仕事をします。
lower-case.js
module.exports = function (RED) {
function yashiTest(config) {
RED.nodes.createNode(this, config);
var node = this;
var node = this;
node.on('input', function(msg) {
msg.payload = (msg.payload).toString(16);
node.send(msg);
});
}
RED.nodes.registerType("yashi-Test", yashiTest);
}
緑色のところが,名前とプログラムです。
lower-case.html
<script type="text/javascript">//スクリプトの書き方
RED.nodes.registerType('yashi-Test',{//ノード名
category: 'TestNodes',//分類の名前
color: '#A9A2A3',//ノードの色
defaults: {
name: {value:""}
},
inputs:1,//入力数
outputs:1,//出力数
icon: "file.png",//アイコン
label: function() {
return this.name||"yashi-node";
//ワークスペースでの表示
}
});
</script>
<script type="text/x-red" data-template-name="yashi-Test">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> 名前</label>
<input type="text" id="node-input-name" placeholder="名前">
</div>
</script>
<script type="text/x-red" data-help-name="yashi-Test">
<p>yashiテストです!</p>
//パレット内でマウスがホバーした時の表示
</script>
実装手順
Raspberry PiのNode-REDは /lib/node-modulesの中に
node-red,npmがあります。
cd ~/.node-red
とタイプして Node-REDのディレクトリ に入り,
npm install /home/pi/Node-RED/node-red-contrib-sample-test
でインストールします。
-
var num = 123;
-
var result = String( num ); //引数に数値を代入
ver i=15
i.string(16)