2023年11月29日水曜日

johnny-five,raspberry pi etc、winからssh失敗のとき

dolittleからアルディーノ的なnodeなやつをみつけた

 JavaScriptとArduinoではじめるIoT入門 〜Johnny-Fiveを使ってみる〜 | 株式会社LIG(リグ)|DX支援・システム開発・Web制作 (liginc.co.jp)

このサイトのサンプルは不完全だったJavaScript Robotics: LED with Johnny-Fiveで成功

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

for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.3.%i

これを事前にせんとarpがうまく作動しない(windows) 

at respiOS, ssh @raspberrypi.local and ifconfig OKだが。。。

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

raspberry pi :: 32bit buster 32G-sdcard needs 50% over for julius 

よって16G-sdcard は音声操縦は無理? mjpg-streamerは大丈夫っぽい、

32bit buster CUI中心が望ましい (いずれにしてもpizeroは非力すぎ)
ーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ラズパイ同士のときはコメントにある命令を実施すればいい
ウインドウズの場合は.ssh/known_hostsをけせばいい(バックは念のためとる)

2023年11月23日木曜日

microbit and raspi、thingsspeak、esp01(pico,uno)、

WiFi Web Server on BBC micro:bit and ESP-01 (ESP8266) - Hackster.io でけた!

192.168.4.1でLEDオンオフできそうだ ATバシバシコード

// for wifi connection
function wait_for_response (str: string) {
    time = input.runningTime()
    while (true) {
        serial_str = "" + serial_str + serial.readString()
        if (serial_str.length > 200) {
            serial_str = serial_str.substr(serial_str.length - 2000)
        }
        if (serial_str.includes(str)) {
            result2 = true
            break;
        }
        if (input.runningTime() - time > 300000) {
            break;
        }
    }
    return result2
}
// generate HTML
function getHTML (normal: boolean) {
    web_title = "ESP8266 (ESP-01) Wifi on BBC micro:bit"
    // HTTP response
    html = "" + html + "HTTP/1.1 200 OK\r\n"
    html = "" + html + "Content-Type: text/html\r\n"
    html = "" + html + "Connection: close\r\n\r\n"
    html = "" + html + "<!DOCTYPE html>"
    html = "" + html + "<html>"
    html = "" + html + "<head>"
    html = "" + html + "<link rel=\"icon\" href=\"data:,\">"
    html = "" + html + "<title>" + web_title + "</title>"
    // mobile view
    html = "" + html + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
    html = "" + html + "</head>"
    html = "" + html + "<body>"
    html = "" + html + "<div style=\"text-align:center\">"
    html = "" + html + "<h1>" + web_title + "</h1>"
    html = "" + html + "<br>"
    // generate status text
    if (normal) {
        if (LED_status) {
            LED_statusString = "ON"
            LED_buttonString = "TURN IT OFF"
        } else {
            LED_statusString = "OFF"
            LED_buttonString = "TURN IT ON"
        }
        html = "" + html + "<h3>LED STATUS: " + LED_statusString + "</h3>"
        html = "" + html + "<br>"
        // generate buttons
        html = "" + html + "<input type=\"button\" onClick=\"window.location.href='LED'\" value=\"" + LED_buttonString + "\">"
        html = "" + html + "<br>"
    } else {
        html = "" + html + "<h3>ERROR: REQUEST NOT FOUND</h3>"
    }
    html = "" + html + "<br>"
    html = "" + html + "<input type=\"button\" onClick=\"window.location.href='/'\" value=\"Home\">"
    html = "" + html + "</div>"
    html = "" + html + "</body>"
    html = "" + html + "</html>"
    return html
}
let LED_buttonString = ""
let LED_statusString = ""
let html = ""
let web_title = ""
let result2 = false
let time = 0
let GET_command = ""
let HTTP_pos = 0
let GET_pos = 0
let client_ID = ""
let serial_str = ""
let result = false
let HTML_strstring = ""
let GET_successboolean = false
let LED_statusnumber = 0
// user settings
// 1 = STA (station, connect to wifi router); 2 = AP (make itself an access point)
let WIFI_MODE = 2
// To Rx pin of ESP-01
const Tx_pinSerialPin = SerialPin.P0
// To Tx pin of ESP-01
const Rx_pinSerialPin = SerialPin.P1
// pin for LED control
const LED_pinDigitalPin = DigitalPin.P2
// wifi router ssid for station mode
let SSID_1 = "your_wifi_ssid"
// wifi router password for station mode
let PASSWORD_1 = "your_wifi_password"
// AP server ssid for AP mode
let SSID_2 = "ESP8266"
// AP password for AP mode (at least 8 characters)
let PASSWORD_2 = "microbit"
pins.digitalWritePin(LED_pin0)
// older ESP8266s may use 51200 or 9600...
serial.redirect(Tx_pinRx_pin115200)
sendAT("AT+RESTORE"1000)
sendAT("AT+RST"1000)
sendAT("AT+CWMODE=" + WIFI_MODE)
if (WIFI_MODE == 1) {
    sendAT("AT+CWJAP=\"" + SSID_1 + "\",\"" + PASSWORD_1 + "\"")
result = wait_for_response("OK")
    if (!(result)) {
        control.reset()
    }
else if (WIFI_MODE == 2) {
    sendAT("AT+CWSAP=\"" + SSID_2 + "\",\"" + PASSWORD_2 + "\",1,4"1000)
}
sendAT("AT+CIPMUX=1")
sendAT("AT+CIPSERVER=1,80")
sendAT("AT+CIFSR")
// startup completed
basic.showIcon(IconNames.Yes)
// process HTTP request
while (true) {
    // read and store 200 characters from serial port
    serial_str = "" + serial_str + serial.readString()
    if (serial_str.length > 200) {
        serial_str = serial_str.substr(serial_str.length - 2000)
    }
    // output HTML
    if (serial_str.includes("+IPD") && serial_str.includes("HTTP")) {
        // got a HTTP request
        client_ID = serial_str.substr(serial_str.indexOf("IPD") + 41)
        GET_pos = serial_str.indexOf("GET")
        HTTP_pos = serial_str.indexOf("HTTP")
        GET_command = serial_str.substr(GET_pos + 5HTTP_pos - 1 - (GET_pos + 5))
        switch (GET_command) {
            case ""// request 192.168.x.x/
                GET_success = true
                break
            case "LED"// request 192.168.x.x/LED
                GET_success = true
                LED_status = 1 - LED_status
                pins.digitalWritePin(LED_pinLED_status)
                break
        }
if (GET_success) {
            // normal HTML
            HTML_str = getHTML(true)
        } else {
            // HTML with error message
            HTML_str = getHTML(false)
        }
        sendAT("AT+CIPSEND=" + client_ID + "," + (HTML_str.length + 2))
sendAT(HTML_str1000)
sendAT("AT+CIPCLOSE=" + client_ID)
serial_str = ""
    }
}
function sendAT(command: string, waitTime: number = 100) {
    serial.writeString(command + "\u000D\u000A")
    basic.pause(waitTime)
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

-------------microbit and raspi uart com -----------------------------------------------

Rapberry PiとBBC Micro:bitでUARTを試す - saitodev.co あっさり成功

ーーーーーーthingspeakーーーーーーーーーーーーーーーーーーーーーーーーーーー

 データを簡単に保存&グラフ化できるThingSpeakが便利! - iwathiの/var/log (hatenablog.com) これはブラウザのget機能をもちいた方法であった

ThingSpeakに登録してcurlでデータを送ってグラフを表示するまで #curl - Qiita     このcurlはウィンドウズのではだめでリナックスでのでOKだった

センサーの計測値をクラウドにためて見てみる | SG Labs これのcurlはpost仕様だった

例題として以下を試行。。。。宿題

ESP32 Publish Sensor Readings to ThingSpeak (easiest way) | Random Nerd Tutorials

ちなみにmicrobitではgroveという拡張機能のUartWiFiをもちいて成功!

basic.showNumber(0)
basic.clearScreen()
basic.pause(100)
grove.setupWifi(
SerialPin.P0,
SerialPin.P1,
BaudRate.BaudRate115200,
"184F32CF8BF3-2G",
"2215085363556"
)
basic.pause(5000)
if (grove.wifiOK()) {
    basic.showNumber(0)
}
basic.forever(function () {
    basic.pause(5000)
    basic.pause(5000)
    basic.pause(5000)
    grove.sendToThinkSpeak(
    "N9RHY2H4F2K7BNCQ",
    45,
    0,
    0,
    0,
    0,
    0,
    0,
    0
    )
})


ーーーーesp01 2kindーーーーーーーuno,pico ok ーーーーーーーーーーーーーーーー

amazonから購入した4pinアダプタ方式esp01は通常とちがい、Unoにブランクコードをいれ

rx->rx,tx->txでつなぐとATがうごいた AC電源から電圧変換して5vでうごいた!

もうひとつのesp01sは3vでうごく!

---------------------for arduinoUNO -------------------------------------------

以下のコードはEsp01のRxをUnoの3pin,TxをUnoの2pinにして動いた!

ifttt line連携もばっちりだった

#include "ArduinoESPAT.h" // rx 2 tx 3であったので辻褄はあう

ESPAT espat("184F32CF8BF3-2G","2215085363556"); 

void setup(){

  Serial.begin(115200);

  if(espat.begin()){

    Serial.println("Initialize Ok");

  }else{

    Serial.println("Initialize Fail");

  }


  if(espat.changeMode(1)){

    Serial.println("Mode OK");

  }else{

    Serial.println("Mode not OK");

  }


  if(espat.tryConnectAP()){

    Serial.println("Connected");

  }else{

    Serial.println("Connect Failed");

  }

  Serial.println(espat.clientIP());

  Serial.println(espat.get("www.yahoo.co.jp", "/", 80));

//ここはエラーになるのでhttpなサイトをさがそう

  Serial.println("Finished");

}

void loop(){

}

------------------for pico ----------------------------------------------

https://microcontrollerslab.com/esp8266-wifi-module-raspberry-pi-pico-web-server/

上記のパチモンつかうので5VとGNDをACアダプタからとり、あとはGNDを共通化して

picoの1番がTX、2番がRXなのでesp01のRx、esp01のTxとつなぐ Unoと一緒でクロス

SSID,PWDを自分のネットにする! コレハバッチリ!

2023年11月17日金曜日

esp32-cam still-film to sdcard, Line 各機種で(宿題あり)

https://randomnerdtutorials.com/esp32-cam-take-photo-save-microsd-card/

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

LINE各機種で

-------obniz --------------------------------------------------------

 https://toyoshi.hatenablog.com/entry/2020/01/18/123904 成功(node.js)

Node.js経由でRaspberryPiやObnizからLINEへの通知を行ってみる - uepon日々の備忘録 (hatenadiary.com) これは参考

---------esp32 and jpg---------------------------------------------------------

ESP32とOV2640でJPEG画像をLINE通知【④プログラム】 | IT太郎の趣味ルーム (it-taro.com) これ宿題

-------------esp32-----------------------------------

https://www.ekit-tech.com/?p=3434 あっさり成功

ーーーーーーーーーーーーーーーーーー

まずラズパイで写真から

# 通知をLINEに挿入 --- (*2)

TOKEN='qmapg2FRrm4gt1V9Qfupz6eIAa05jDTNAw7xoGIU31Q'

API = 'https://notify-api.line.me/api/notify' 

import requests

fname='./image.jpg'

post_data = {'message': '侵入者アリ'}

headers = {'Authorization': 'Bearer ' + TOKEN}

files={'imageFile': open(fname,'rb')}

requests.post(API, data=post_data,headers=headers,files=files)


ーつぎはメッセージーーーーーーーーーーーーーーーーーーーーーー

import requests


url = "https://notify-api.line.me/api/notify" 

token = "トークン"

headers = {"Authorization" : "Bearer "+ token} 

message =  "そぞら@プログラミングに夢中すぎる会社員より" 

payload = {"message" :  message} 

r = requests.post(url, headers = headers, params=payload)

ーーーーーーつぎはラズピコwでーーーーーーーーーーーーーーーーーーーーーーーー

https://zenn.dev/iot101/articles/d8e26ac7be133b を参考にlinenotify.pyをいれてから

import machine

from time import sleep

import network, urequests

ssid = '184F32CF8BF3-2G'

password = 'パスワード'


def connect():

    #Connect to WLAN

    wlan = network.WLAN(network.STA_IF)

    wlan.active(True)

    wlan.connect(ssid, password)

    while wlan.isconnected() == False:

        print('Waiting for connection...')

        sleep(1)

    print(wlan.ifconfig())


connect()

from linenotify import LineNotify


# Line token

TOKEN = "qmapg2FRrm4gt1V9Qfupz6eIAa05jDTNAw7xoGIU31Q"


# Make instance

line = LineNotify(TOKEN)


# Send text message

print("テキスト送信中")

result = line.notify('こんにちは。Line Botです。')

print("result:", result)


# Show sticker/stamp

print("スタンプ送信中")

result2 = line.notifySticker(3,230,'これはスタンプです。')

print("result2:", result)




2023年11月5日日曜日

picow-radicon,HC05 with microbit,flask rasdicon code,

## raspberry pi pico w wifi code :: # is softap, hard code  is station mode

from machine import Pin,PWM

import network

import socket

import utime

# LED = machine.Pin("LED",machine.Pin.OUT) #builtin led

IN1 = PWM(Pin(14))

IN2 = PWM(Pin(15))

IN1.freq(100)

IN2.freq(100)

IN3 = PWM(Pin(16))

IN4 = PWM(Pin(17))

IN3.freq(100)

IN4.freq(100)

#IN1 = Pin(14,Pin.OUT)

#IN2 = Pin(15,Pin.OUT)

#IN3 = Pin(16,Pin.OUT)

#IN4 = Pin(17,Pin.OUT)

max_duty = 65025

# from metaele labo site


def stop():

    IN1.duty_u16(0)

    IN2.duty_u16(0)

    IN3.duty_u16(0)

    IN4.duty_u16(0)

    utime.sleep(0.5)

    #IN1.value(0)

    #IN2.value(0)

    #IN3.value(0)

    #IN4.value(0)

    #utime.sleep(0.5)


def front():

    IN1.duty_u16(int(max_duty*0.5))

    IN2.duty_u16(0)

    IN3.duty_u16(int(max_duty*0.5))

    IN4.duty_u16(0)

    #IN1.value(1)

    #IN2.value(0)

    #IN3.value(1)

    #IN4.value(0)  

    utime.sleep(0.5)

    stop()

   

def back():

    IN1.duty_u16(0)

    IN2.duty_u16(int(max_duty*0.5))

    IN3.duty_u16(0)

    IN4.duty_u16(int(max_duty*0.5))

    #IN1.value(0)

    #IN2.value(1)

    #IN3.value(0)

    #IN4.value(1)

    utime.sleep(0.5)

    stop()

    

def left():

    IN1.duty_u16(int(max_duty*0.5))

    IN2.duty_u16(0)

    IN3.duty_u16(0)

    IN4.duty_u16(int(max_duty*0.5))

    #IN1.value(1)

    #IN2.value(0)

    #IN3.value(0)

    #IN4.value(1)

    utime.sleep(0.5)

    stop()


def right():

    IN1.duty_u16(0)

    IN2.duty_u16(int(max_duty*0.5))

    IN3.duty_u16(int(max_duty*0.5))

    IN4.duty_u16(0)

    #IN1.value(0)

    #IN2.value(1)

    #IN3.value(1)

    #IN4.value(0)

    utime.sleep(0.5)

    stop()

    

#ssid = 'RPI_PICO_AP'                  

#password = '12345678' 

ssid = '184F32CF8BF3-2G'                  

password = '2215085363556' 

wlan = network.WLAN(network.STA_IF)

wlan.active(True)

wlan.connect(ssid, password)

while wlan.isconnected() == False:

    print('Connecting to Wi-Fi router')

    utime.sleep(1)

wlan_status = wlan.ifconfig()

print('Connected!')

print(f'IP Address: {wlan_status[0]}')

print(f'Netmask: {wlan_status[1]}')

print(f'Default Gateway: {wlan_status[2]}')

print(f'Name Server: {wlan_status[3]}')

#ap = network.WLAN(network.AP_IF)

#ap.config(essid=ssid, password=password)

#ap.active(True)            #activating

#while ap.active() == False:

#  pass

#print('Connection is successful')

#print(ap.ifconfig())

# print('listening on', ap.ifconfig()[0])  # wlan change to ap fof softap mode

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()

s.bind(addr)

s.listen(1)

#html

def home_page():

    html = """<html>

    <title>Tank Control</title>

    <center>

    <h>Tank Control</h1>

    <p>

    <a href="/front"><input type="button" value="front"></a>

    <a href="/back"><input type="button" value="back"></a>

    </p>

    <p>

    <a href="/right"><input type="button" value="right"></a>

    <a href="/left"><input type="button" value="left"></a>

    </p>

    </center>

    <html>"""

    return html


while True:

    cl,addr = s.accept()   

    print("req from = ")

    print(addr)

    request = cl.recv(1024)

    request = str(request)

    if request.find("/front") ==6:

        front()

    if request.find("/back") ==6:

        back()

    if request.find("/right") ==6:

        right()

    if request.find("/left") ==6:

        left()

    response = home_page()

    cl.send(response)

    cl.close()

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Arduinoを使いBluetooth通信をやってみる!HC-05/HC-06 Bluetoothモジュールの使い方! | ぶらり@web走り書き (burariweb.info) 総論

micro:bitとつなぐにはswitch scienceのi2cロジック変換を用いてTX,RXをクロス接続

5Vと3Vの接続は不要だった HC05のGNDはmicrobitのGNDに直付けする

serial.redirect(
SerialPin.P0,
SerialPin.P1,
BaudRate.BaudRate9600
)
basic.forever(function () {
    basic.showString(serial.readUntil(serial.delimiters(Delimiters.NewLine)))
    basic.pause(200)
})

ーーーーーーーーーーーーーー templates/main.html ------------------------------ 

<html><head><title>Current Status</title></head>

<body>

  <h1>Device Listing and Status</h1>

{% for pin in pins %}

 {% if pins[pin].name == "for-back": %}

  <p>The {{ pins[pin].name }}</br></br>

      (<a href="/{{pin}}/for">forward</a>) 

      (<a href="/{{pin}}/back">backward</a>)</br>

  </p>

 {% elif pins[pin].name == "left-right": %}

  <p>The {{ pins[pin].name }}</br></br>

      (<a href="/{{pin}}/left">left</a>) 

      (<a href="/{{pin}}/right">right</a>)</br>

  </p>

 {% endif %}

{% endfor %}

{% if message %}

  <h2>{{message}}</h2>

{% endif %}

</body></html>

------------------------- weblamp-radicon.py --------------------------------

だいぶ論理が冗長なので将来変更しようと思う


from gpiozero import LED, Motor

from time import sleep



from flask import Flask, render_template, request

app = Flask(__name__)


motor = Motor(forward=19, backward=26,pwm=True)

motor2 = Motor(forward=12, backward=16,pwm=True)

pins = {

    23 : {'name' : 'for-back'},

    25 : {'name' : 'left-right'}

    }


led23 = LED(23)

led23.off()

led25 = LED(25)

led25.off()


@app.route("/")

def main():

    templateData = {

        'pins' : pins

        }

    return render_template('main.html', **templateData)


@app.route("/<changePin>/<action>")

def action(changePin, action):

    changePin = int(changePin)

    deviceName = pins[changePin]['name']

    if action == "for":

        if changePin == 23:

            led23.on()

            motor.forward(0.3)

            motor2.forward(0.3)

            sleep(2)

            motor.stop()

            motor2.stop()

        message = "Turned " + deviceName + " to for."


    if action == "back":

        if changePin == 23:

            led23.off()

            motor.backward(0.3)

            motor.backward(0.3)

            sleep(2)

            motor.stop()

            motor2.stop()

        message = "Turned " + deviceName + " to back."

        

    if action == "left":

        if changePin == 25:

            led25.on()

            motor.forward(0.3)

            motor2.backward(0.3)

            sleep(2)

            motor.stop()

            motor2.stop()

        message = "Turned " + deviceName + " to left."


    

    if action == "right":

        if changePin == 25:

            led25.off()

            motor.backward(0.3)

            motor2.forward(0.3)

            sleep(2)

            motor.stop()

            motor2.stop()

        message = "Turned " + deviceName + " to left."



    templateData = {

        'message' : message,

        'pins' : pins

    }


    return render_template('main.html', **templateData)


if __name__ == "__main__":

    app.run(host='0.0.0.0', port=80, debug=True)


2023年11月3日金曜日

pwm ,webiopi,gpiozero,picozero,timer-hard-int,i2c7segment

 https://vefortec.hatenablog.com/entry/raspberrypi-webiopi 64bitOSでも成功

ただしBBKSのそれは難解だ。。。

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

https://gpiozero.readthedocs.io/en/stable/api_output.html :: drv8833 OK

from gpiozero import Motor

from time import sleep

motor = Motor(forward=19, backward=26,pwm=True) #PWM 0~1が可能に!

while True:

    motor.forward(0.2)

    sleep(2)

    motor.forward(0.9)

    sleep(0.5)

    print("f")

    motor.stop()

    sleep(1)

    motor.backward()

    sleep(0.5)

    print("b")

    motor.stop()

    sleep(1)

Raspberry PiのハードウェアPWMをpigpioで出力する #RaspberryPi - Qiita

【 第33回 】pigpioにはハードウェアPWM発生関数”hardware_PWM”もあった! | FABSHOP.JP -デジタルでものづくり! ファブショップ ! この2個のサイトでbbks理解!

------------picozero----------------------------------------------

https://picozero.readthedocs.io/en/latest/recipes.html :: gpiozero相当品

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

https://tech-and-investment.com/raspberrypi-pico-14-gpio-interrupt/ :: 

通常のやつだがスイッチをpull-downでつかうので制限抵抗必須!

MicroPython的午睡(25) ラズパイPico、Timer周波数設定の上限? | デバイスビジネス開拓団 (jhalfmoon.com) これがタイマー割り込みのようだ たぶんesp32でも一緒

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

https://iot.keicode.com/arduino/arduino-tm1637.php :: 7seg-i2c at arduinoだがラズパイでするには