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世紀前半で以後応神以前まで纒向に宮あり

関裕二が同時期という神武と欠史八代は橿原に宮の記載あり、また神功皇后もほぼ同時期という

4世紀に大和が北九州と融和?(吉備と出雲の協力) つまり神武、崇神、応神は同時代?

少なくとも近畿で3世紀末に九州の埋葬文化であった銅鏡が古墳におさめられるようになった

5世紀に瀬戸内航路の安全開拓(雄略天皇) 

景行は4世紀中期、神功皇后が仲哀天皇をみとったのは362年(古事記)

応神〜雄略が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 () {
    
})