2023年12月29日金曜日

ATpedia,esp01/01sでAT

---------arduino send-client--------
#include <ESP8266.h>
#define SSID ""
#define PASSWORD ""
#define HOST_NAME "192...." // 自分のPCでパイソンサーバがうごくので、そのIPを入れる
#define HOST_PORT (9999)

SoftwareSerial mySerial(3,2);//rx,tx
ESP8266 wifi(mySerial);

void setup(void){
    Serial.begin(9600); // arduinoUNOのソフトシリアルは9600が上限なので
    mySerial.begin(115200); //理由不分明だがesp01もボーレートを落とす
    mySerial.println("AT+UART_CUR=9600,8,1,0,0");
    delay(10);
    mySerial.begin(9600);
    delay(10);
    if (wifi.setOprToStation()){ // set to station mode
        Serial.println("ok:setup");
    } else {
        Serial.println("error:setup");
    }
    if (wifi.joinAP(SSID,PASSWORD)){ // join local net
        Serial.println(wifi.getLocalIP().c_str());
    } else {
        Serial.println("failed:AP connect");
    }
    delay(10);
    if (wifi.disableMUX()){ // for client mode
        Serial.println("ok:single");
    } else {
        Serial.println("error:single");
    }
    delay(100);
}
void loop(void){ // send to PC python receive_server
    char msg[128] = {0};
    strcat(msg,"hello from Arduino to pc");
    if (wifi.createTCP(HOST_NAME,HOST_PORT)){
        Serial.println("ok:tcp connect.");
        wifi.send(msg,strlen(msg));
        wifi.releaseTCP();
    } else {
        Serial.println("failed:tcp connect");
    }
    while(1){
        delay(10000);
    }
}
----------------python receive_server ----------------------------------------------
import socket
host = "192.168...." # check by ipconfig/ifconfig
port = 9999
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind((host,port))
sock.listen(10)
cs,caddr=sock.accept() # caddrr not used as below
while True:
    msg = cs.recv(1024)
    print(msg.decode('ascii'))
    break
sock.close()

2023年12月25日月曜日

esp01/wroom2 AT and LUA and arduinoIDE

 USB ESP-01 Programming Adapter: A Step-by-Step Guide - (edgemicrotech.com)

これでATfirmware,ArduinoIDEいずれも書き込みOK

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

ESP8266にNodeMCUをアップロードしてHello Worldする #Lua - Qiita 

これを展開実行かってにinternal nodemcuとなるのでesp01ではconfigで1Mだけ書き直し

あとは3.3vの設定でftdiにて書き込む(このさいgpio-zeroはGNDにおとしておく)

終了後はGPIO-0はとる Cool termであそぶには、以下の配線を参考にした

ESP8266のファームウェアをWindowsからアップロードする #ESP8266 - Qiita

【Arduino】小型Wi-FiモジュールESP8266(ESP-01)のファームウェアを更新する!初期状態に戻しATコマンドを使えるようにする! | ぶらり@web走り書き (burariweb.info)

でnodemcu-flasherはluaしかかきこめず,悪評だったflash download toolsで115200

ボーで当該BINの書き込みに成功してAT復活した しかも実用本のwifi-connectで

getLocalIPも成功になった!  ファームウエアが古かったためのようだ

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

wroom2のばあい、RSTーPRGMの順にリリースしてflasherで書き込み!

jdkインストのあとReleases · 4refr0nt/ESPlorer (github.com)でzipを手に入れ

esplorer.shをチョンチョンすると立ち上がる あとはesp826-4mbyteのRST押して

ESPlorer-NodeMCUのLuaソフト開発 | TomoSoftでOPENでつなぐ

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

wroom2をarduinoIDEでつかうのは秋月に詳しいPDFあり!





2023年12月20日水曜日

avr deep zone(2313)

AVRでのタイマとPWMの使い方 | うしこlog (nomaki.jp) も参考に

 #include <avr/io.h> // なくてもうごいたが

void setup(){

 TCCR1A=0b10100001; //   8ビット高速PWM動作

 TCCR1B=0b00001011;  //     clkI/O/64 (64分周)

// 7,11ピンの490Hzとそろえてみました。特に周期は問題になりませんが、モーターを滑らかに動かすには100Hz以上は必要らしいです(LEDは20~50Hz程度)。逆に周波数が高すぎるとノイズの発生、部品の劣化があるそうです。

OCR1A=0; // 初期化

OCR1B=0;

pinMode(12,OUTPUT); // 

pinMode(13,OUTPUT);

}

// analogWrite()を使うときは、pinMode()を設定する必要がないので省略していますが、レジスタを直接設定するときにはpinMode()が必要です。もしくは DDRB=0b00011000;

void loop() {

  analogWrite(11,127);   // timer0 A   

  analogWrite(7,0);   // timer0 B

 OCR1A=127;  // timer1 A デューティ比 50%(0~255)

 OCR1B=0;

  delay(500);

  analogWrite(11,0);   // timer0 A

  analogWrite(7,0);   // timer0 B

 OCR1A=0;

 OCR1B=0;

  delay(500);

  analogWrite(11,0);   // timer0 A

  analogWrite(7,127);   // timer0 B

 OCR1A=0;

 OCR1B=127;

  delay(500);

  analogWrite(11,0);   // timer0 A

  analogWrite(7,0);   // timer0 B

 OCR1A=0;

 OCR1B=0;

  delay(500);

}

// タイマ0、タイマ1のPWM4つをArduino(analogWrite()を使う)で設定しようとすると、なぜかATtiny2313ではタイマ1のPWMが反応しません。なのでタイマ0のPWMはArduinoのanalogWrite関数を使い、タイマ1のPWMはレジスタを直接設定しています。もちろんすべてレジスタを直接設定してもOKです。
// PWM周波数はATtinyCoreで、タイマは8MHz時488Hzに設定されているので、タイマ1も高速 PWM モードでそれに合わせました。なお位相基準PWMモードを使うと周波数が半分になりますが、のこぎり波を使う高速 PWM モードに比べて三角波を使うためPWM波形の位相がずれにくく、モーター制御には有利らしいです。
もう一点、タイマ1が使えなかったのはtone()が使っているからだそうです。よろしくお願いします。

以下ATtinyCoreより抜粋。
PWM周波数 
F_CPU:8MHz  F_PWM TC0:8/64/256= 488Hz  F_PWM TC1:8/64/256= 488Hz
TC0 は常に高速 PWM モードで実行されます。 ミリ秒には TC0 を使用しますが、位相補正モードはミリ秒タイマーでは使用できません。以下略。
トーンサポート
Tone() は Timer1 を使用します。最良の結果を得るには、ピン PB3 (12) または PB4 (13) を使用します。これは、割り込みを使用する代わりにハードウェア出力比較を使用して方形波を生成するためです。Tone() を使用するには、[第 2 タイマーの初期化: はい] を選択する必要があります。tone() は PB3 と PB4 の PWM を無効にします。
> 以前いただいた上記コードはたしかに動くのですが、attiny2313の添付ファイルにはOCR1Aという項目がなくOCR1AH,OCR1ALはありました ただ添付ファイルでもTCCR1Aはtimer0 8bitと明記されています このあたりの詳細おしえてください

このコードは確かArduinoで書くとタイマ1が動かないというので書いた覚えがあります。原因は「16ビットタイマがtoneライブラリ用に初期化されているためPWM出力ができない」と記憶しております。
そこでタイマ0はArduino、タイマ1はレジスタを直接制御し一番簡単な高速PWM8ビットを使いました。これだとTOP値が255なのでOCR1Aの0から7ビットまで指定すれば良いということになります。(OCR1Aの8から15ビットがOCR1AH)
つまりデューティー比50%ならOCR1A=127; またはOCR1A=0b01111111;(OCR1AL=0b01111111; OCR1AH=0b00000000; と同じ)となります。もっと細かく制御したければ9または10ビットを使うことになります。その時はLとHを指定する必要があります。
「TCCR1Aはtimer0 8bit」はタイマ1高速PWM8ビットの事かと思います。
うまく説明できたかどうか、よろしくお願いします。

2023年12月12日火曜日

phpサーバ,Esp01and01s

 https://macoblog.com/php-localserver/ 簡単なphpのみのローカルサーバ

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

ESP-01 vs ESP-01S: Which one is right for you? (best-microcontroller-projects.com)

ITEA-weeEsp8266は両方うごいた

ArduinoEspATは前者はうごいた、後者は未経験 このモジュールはGETのみ実装

Arduino_HttpClient_ESP8266_AT-master、両者未経験、Postも実装していた

ESP8266をTCPサーバとTCPクライアントにするATコマンド実例:Wi-Fiモジュール「ESP8266」で始めるIoT DIY(3)(2/4 ページ) - MONOist (itmedia.co.jp) 重要

【Arduino】小型Wi-FiモジュールESP8266(ESP-01)の基本的な使い方!スケッチの書き込み&モジュール単体で動かす基本的な方法! | ぶらり@web走り書き (burariweb.info) 

このサイトを拾い読みすると色々のっていて有益 ep01関係でサーチすると一覧でる


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だがラズパイでするには


2023年10月21日土曜日

日本古代史のまとめ

 高地性集落の分布は、弥生中期に中部瀬戸内と大阪湾岸に[3]弥生後期に近畿とその周辺部にほぼ限定されている。倭国大乱は弥生末期の2世紀後半。

高地性集落は、古墳時代(3世紀中ごろから6世紀末まで、592年に飛鳥がはじまる)前期には、西日本の広島・鳥取に、北陸の富山・石川・新潟に分布する 

3世紀は尾張の協力で大和建国(卑弥呼は247年に死亡、266年以降150年は大陸との交流なし 369年に百済より石上神宮の七支刀、箸墓は3世紀後半、) 

4世紀に大和が北九州を併呑(吉備と出雲の協力) 5世紀に瀬戸内航路の開拓(雄略天皇) 

実在したとすれば崇神は4世紀前半、景行は4世紀中期、神功皇后は後期、応神〜雄略が5世紀

6世紀に前飛鳥時代が始まる(継体と磐井) 7世紀は飛鳥時代! 8世紀が奈良時代!

ble by picow, julius latest memo

 https://qiita.com/KICKER_VR/items/dd031645d097f18d8c5a picowをペリフェラルにしている


https://fielddesign.jp/technology/ble/blespec_advertise/ ble 一般論 セントラルもあるげな

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

microbitはv2からbleになり(事前の)ペアリング不要と設定して使用 非常に簡単になったが

bluetooth serial terminalでしか操作できんのが不便

----------------julius latest--------------------------------------------------------------------------------------

https://kocoffy.com/iot/post-519/ これが一番ていねい

https://qiita.com/en129/items/31b0f67c1d886df2aef6 :: 4.6で辞書つくり 空白の説明がくわしい

https://qiita.com/chiapis2/items/a2ed64414c9e49b6cb42 音声操作編

https://dk521123.hatenablog.com/entry/37451114 これでgrammerでなくgrammarとしる

2023年10月9日月曜日

radicon-car-esp32, ラズピコのサーボ位置決め など

TB1622FNGのピン配置

PWMA 12,AIN1 13,AIN2 14, STBY 3V3, GND TO ESP32

VM FROM 5V-BATTERY,VCC 5V,GND FROM 5V-BATTERY,GND TO ESP32

https://404background.com/circuit/tb6612fng/#%E5%9B%9E%E8%B7%AF%E3%82%92%E7%B5%84%E3%82%80 に詳しい説明があるがアルディーノUNO用にて注意

#include <ESP32Servo.h> // pwm freq 50hz固定

#include <BluetoothSerial.h>

// 定数の定義

#define SERVO 5        // MG996R アルディーノではpwm可能なPIN必須

#define PWMA 12       // TB6612FNGのPWMA アルディーノではpwm可能なPIN必須

#define AIN1 13          / TB6612FNGのAIN1

#define AIN2 14               // TB6612FNGのAIN2

#define LEDC_CHANNEL 6        // PWMのチャンネル for dcmotor

#define LEDC_BASE_FREQ 10000  // PWMの周波数 for dcmotor

#define MAX_SPEED 3           // 速度の最大値

#define MIN_SPEED -1          // 速度の最小値

#define ANGLE_STEP 6          // 角度の増分

#define ANGLE_MAX 18          // 角度の最大値

// Bluetoothシリアルにつける名前

const char *btname = "ESP32Car";

// MG996Rの角度調整

const int servo_offset = -5;

// 速度・角度 を保存するグローバル変数

int speed = 0;

int angle = 0;

// MG996RとBluetoothシリアルに対応するグローバル変数

Servo myServo;

BluetoothSerial SerialBT;

void setup() {

  // Bluetoothシリアルの初期化

  SerialBT.begin(btname);

  // PWMの初期化

  ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, 8); 

// チャンネル指定と周波数、分周ビットの指定 8ビットなら0から255

  ledcAttachPin(PWMA, LEDC_CHANNEL); //上記チャンネルをPINに紐付け

  // MG996Rの初期化

  myServo.attach(SERVO); // MG996Rのピン番号を指定

  myServo.write(90 + servo_offset);

  // GPIOピンの初期化

 pinMode(PWMA, OUTPUT);

  pinMode(AIN1, OUTPUT);

  pinMode(AIN2, OUTPUT);

 }


void loop() {

  // Bluetoothシリアルから文字を読み込んで処理する

  read_bt();

   // モーターを操作する

  operate_motor();

}


// Bluetoothシリアルから文字を読み込んで処理する

void read_bt() {

  // Bluetoothシリアルから文字を受信しているかどうかを判断する

  if (SerialBT.available()) {

    // Bluetoothシリアルから1文字読み込む

    int ch = SerialBT.read();

    // 文字が「e」の場合

    if (ch == 'e') {

      // speedがMAX_SPEEDより小さければ1増やす(加速)

      if (speed < MAX_SPEED) {

        speed++;

      }

    }

    // 文字が「x」の場合

    else if (ch == 'x') {

      // speedがMIN_SPEEDより大木れば1減らす(減速)

      if (speed > MIN_SPEED) {

        speed--;

      }

    }

    // 文字が「d」の場合

    else if (ch == 'd') {

      // angleがANGLE_MAXより小さければANGLE_STEPだけ増やす(ハンドルを右に切る)

      if (angle < ANGLE_MAX) {

        angle += ANGLE_STEP;

      }

    }

    // 文字が「s」の場合

    else if (ch == 's') {

      // angleが-ANGLE_MAXより大きいければANGLE_STEPだけ減らす(ハンドルを左に切る)

      if (angle > -ANGLE_MAX) {

        angle -= ANGLE_STEP;

      }

    }

    // 文字が「i」の場合

    else if (ch == 'i') {

      // モーターを止め、ハンドルを中心に戻す

      speed = 0;

      angle = 0;

    }

  }

}


// モーターを操作する

void operate_motor() {

  // speedがプラス

  if (speed > 0 ) {

    // モーターを正転させる

    digitalWrite(AIN1, HIGH);

    digitalWrite(AIN2, LOW);

  }

  // speedがマイナスの場合

  else if (speed < 0) {

    // モーターを逆転させる

    digitalWrite(AIN1, LOW);

    digitalWrite(AIN2, HIGH);

  }

  // その他の場合

  else {

    // モーターを止める

    speed = 0;

    digitalWrite(AIN1, LOW);

    digitalWrite(AIN2, LOW);

  }

  // モーターの回転速度を決める ledcWriteはアルディーノではanalogWriteに相当

  ledcWrite(LEDC_CHANNEL, 30 + 40 * abs(speed));

  // MG996Rの角度を決める

  myServo.write(90 + angle + servo_offset);

}

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


ラズピコは以下の通り まずdig_0でニュートラルにホーンをとりつける

あとは(+)(ー)で左右に振る!

 

from machine import PWM, Pin

import time

IN1=Pin(1,Pin.OUT)

IN2=Pin(2,Pin.OUT)

servo1 = PWM(Pin(28))

servo1.freq(50)

dig_0 = 0.0725    #0° almost 4700

dig_90 = 0.12     #90° almost 7800

dig__90 = 0.025     #-90° almost 1600

max_duty = 65025


while True:

    #servo1.duty_u16(int(max_duty*dig_90))

    servo1.duty_u16(6000)

    print("40")

    time.sleep(3)

    servo1.duty_u16(int(max_duty*dig_0))

    print("0")

    time.sleep(3)

 #servo1.duty_u16(int(max_duty*dig__90))

    servo1.duty_u16(3000)

    print("-40")

    time.sleep(3)

2023年10月6日金曜日

httpd by c, dcm-boad on micricobit

 

https://daeudaeu.com/c-http-server/

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

dcm-driver-boad::

input.onButtonPressed(Button.Afunction () {
    radio.sendString("f")
    basic.showLeds(`
        . . # . .
        . # # # .
        # . # . #
        . . # . .
        . . # . .
        `)
})
input.onButtonPressed(Button.ABfunction () {
    radio.sendString("s")
    basic.showIcon(IconNames.Diamond)
})
radio.onReceivedString(function (receivedString) {
    basic.showString(receivedString)
    if (receivedString == "f") {
        basic.showLeds(`
            . . # . .
            . # # # .
            # . # . #
            . . # . .
            . . # . .
            `)
        pins.analogWritePin(AnalogPin.P1602)
        pins.digitalWritePin(DigitalPin.P131)
        pins.digitalWritePin(DigitalPin.P120)
    }
    if (receivedString == "b") {
        basic.showLeds(`
            . . # . .
            . . # . .
            # . # . #
            . # # # .
            . . # . .
            `)
        pins.analogWritePin(AnalogPin.P1543)
        pins.digitalWritePin(DigitalPin.P130)
        pins.digitalWritePin(DigitalPin.P121)
    }
    if (receivedString == "s") {
        basic.showIcon(IconNames.Diamond)
        pins.analogWritePin(AnalogPin.P1576)
        pins.digitalWritePin(DigitalPin.P131)
        pins.digitalWritePin(DigitalPin.P121)
    }
})
input.onButtonPressed(Button.Bfunction () {
    radio.sendString("b")
    basic.showLeds(`
        . . # . .
        . . # . .
        # . # . #
        . # # # .
        . . # . .
        `)
})
radio.setGroup(132)
basic.showIcon(IconNames.Heart)
pins.digitalWritePin(DigitalPin.P141)
basic.forever(function () {
    
})