top of page
プログラム

 プログラミング Thonny Python 

 プログラムを作るにはGPIO(General Purpose Input Output)の知識が必要です。2021/6/20thonnyPython開始

 GPIO 

アンカー 1

 基盤の右側にある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 Pythonでプログラムが開始できます。thonnyの日本語はすぐには見つかりません。多分"かわいい"??トニートニーチョッパー?

 GPIO 

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点滅 

 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チカチカ 

 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 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)のU​P,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 

 OLED 

2021/6/16

 128x64または128x32のLEDがパネルの中に入っている表示装置です。I2Cで動作します。

 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ドライバインストール 

 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 

 ​気圧計BMP180 

2021/7/8

 BMP180

 使用する前に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でできます。

アストロPi                エミュレータ

 sudo apt-get update 

 

 sudo apt-get install sense-hat 

 

 使用法(Python)例

 from sense_hat import SenseHat

 sense = SenseHat() 

 sense.show_message("Hello world!")

 Raspberry Pi 3/2/A+/B+用のHAT(拡張基板)です。8x8の16ビットLEDを使ったディスプレイとさまざまなセンサが載っていて、特に宇宙科学分野における環境条件の学習に最適です。右下に小さいジョイスティックも在ります。

 SenseHATソフトウェアをインストールします。リファレンス

C言語

2021/7/11

C言語

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

CircuitPython

ThonnyPython の前身のようです。

HAT

 ラズパイ専用 sensorHAT 

 センサーハット3号 

センサーHAT

2021/6/15

 あけももさんが販売しているセンサーハットです。SWx2 LEDx2 赤外線受光子 赤外線LED CDS 傾きセンサ 気圧センサ 温湿度センサ 人感センサ 距離センサと盛りだくさんのセンサが乗っているRaspberry Pi 0の大きさのハットです。

 センサの測定はPythonで行いNode-Redで表示するそうです。

2021/6/17

​ 組み立てに2日かかるということで勉強をしていたところ,部品の数が少ないHATも販売されていたので,これを先に動かしてみようと購入しました。

​ これならLED2つとタクトSW2つOLED1つですぐに使えるようになりそうです。

Node-RED

2021/6/15

​ センサーハットを入手しようとして初めてNode-REDに出会い勉強を始めました。

 Node-RED 

2021/6/29

 用意されたブロックを組み立ててプログラムを作り出せます。とても簡単な方式です。

 ラズベリーパイで使うと,各GPIOやI2Cなどの入出力が使えます。

​ ブラウザで実行することができ,ダッシュボードという視覚的に操作ができるので便利な道具です。パイソンと組み合わせるとかなり実用的なものを作り出すことができます。

2021/6/15

 パソコンで使う 

パソコンでNode-RED

 Node-REDをラズベリーパイに実装 

RaspberryPiで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のレイアウト 

 サイドバーのプルダウンメニューボタンを押すと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 

機能

 アンドロイドでNode-REDを実行 

アンドロイドでNode-REDを実行

 Termux 

 アプリストアのTermuxアプリを利用することで、簡単に Andoroidデバイス上でNode-REDを実行することができます。

 検索☞インストール☞コマンド入力

2021/6/24start

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にデータを送り出します。

 ストレージ 

 ストレージ 

2021/7/5

 ファイルの書き出し削除を行います。

​ save,deleteファイル

2021/7/5

 ファイルを読み込みます。

readファイル

 OLED 

 OLED 

 サードパーティーの作品です。

2021/7/5

 OLEDにテキストを出力します。

 

 縦9ドットの英数字をOLEDに出力します。

2021/7/5

 OLEDの表示を消去します。

 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

でインストールします。

Javascript
  1. var num = 123;

  2. var result = String( num ); //引数に数値を代入

​ ver i=15

​ i.string(16)

bottom of page