2026年5月17日日曜日

microdot on raspicow(draft)

 MicroPythonでWebサーバーフレームワーク「Microdot」を動かすには、マイコンをWi-Fiに接続し、ソースコードをマイコンに転送します。ESP32やRaspberry Pi Pico Wなどのネットワーク対応ボードを使用し、以下の手順に沿って設定を行います。

1. 必要な環境の準備
  • マイコンボード: Wi-Fi通信ができる ESP32 または Raspberry Pi Pico W
  • 開発ツール: コードの記述と転送には Thonny IDE を使うのが最も簡単です。
2. Microdotのインストール
Thonny IDEのパッケージ管理機能を使うか、直接ファイルを転送してインストールします。
方法A: Thonnyのパッケージマネージャーを使う(簡単)
  1. マイコンをPCに接続し、Thonnyで認識させます。
  2. メニューの「ツール」>「パッケージ...」を開きます。
  3. 検索バーに microdot と入力して検索します。
  4. 検索結果から microdot を選択し、「インストール」をクリックします。
方法B: ソースコードを直接転送する
  1. GitHubのMicrodotリポジトリ にアクセスします。
  2. 必要な microdot.py ファイル(および必要に応じて microdot_asyncio.py などの拡張ファイル)をダウンロードします。
  3. Thonnyを使用して、マイコンのルートディレクトリ(/)にファイルを保存します。
3. 動かしてみる(サンプルコード)
Microdotを利用して、Webブラウザに「Hello, Microdot!」と表示させる最もシンプルなサーバーのプログラムです。Thonnyのエディタに以下のコードを貼り付けます。
python
from microdot import Microdot
import network

# 1. Wi-Fiに接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('YOUR_SSID', 'YOUR_PASSWORD') # SSIDとパスワードを書き換えてください

while not wlan.isconnected():
    pass

print('Network config:', wlan.ifconfig())

# 2. Microdotのインスタンスを作成
app = Microdot()

# 3. ルート(/)にアクセスした時の処理を定義
@app.route('/')
def index(request):
    return 'Hello, Microdot!'

# 4. サーバーの起動
app.run(port=80)
コードは注意してご使用ください。
4. 実行と確認
  1. コード内の 'YOUR_SSID''YOUR_PASSWORD' を、ご自身のWi-Fi環境に合わせて書き換えます。
  2. Thonnyの実行ボタン(または F5 キー)を押してプログラムを実行します。
  3. Thonnyのシェル(ターミナル)画面に、マイコンに割り当てられたIPアドレス(例: 192.168.x.x)が表示されます。
  4. PCやスマートフォンのWebブラウザを開き、アドレスバーにそのIPアドレスを入力してアクセスします。ブラウザに「Hello, Microdot!」と表示されたら成功です。

2026年5月14日木曜日

tinygo and esp01 on raspico(ドラフト)

以下を成功したのでget ?t=21.1&h=45をmock get reqしよう

 package main

import (

"machine"

"time"

)


var uart = machine.UART0

var buf = make([]byte, 256)


// --------------------

// コマンド送信

// --------------------

func send(cmd string) {

for i := 0; i < len(cmd); i++ {

uart.WriteByte(cmd[i])

}

uart.WriteByte('\r')

uart.WriteByte('\n')

}


// --------------------

// 応答待ち

// --------------------

func waitFor(expected string, timeout time.Duration) bool {

start := time.Now()

data := ""


for time.Since(start) < timeout {

n, _ := uart.Read(buf)

if n > 0 {

part := string(buf[:n])

print(part)

data += part


if contains(data, expected) {

return true

}

if contains(data, "ERROR") {

return false

}

}

}

return false

}


// --------------------

// 文字列検索

// --------------------

func contains(s, sub string) bool {

for i := 0; i <= len(s)-len(sub); i++ {

if s[i:i+len(sub)] == sub {

return true

}

}

return false

}


func main() {


// ★ ESP-01はまず115200か9600を試す

uart.Configure(machine.UARTConfig{

BaudRate: 115200, // ← 合わなければ115200に変更

TX:       machine.GPIO0,

RX:       machine.GPIO1,

})


time.Sleep(5 * time.Second)


// --------------------

// AT確認

// --------------------

send("AT")

if !waitFor("OK", 3*time.Second) {

println("AT failed")

return

}


// --------------------

// リセット

// --------------------

send("AT+RST")

time.Sleep(5 * time.Second)


// 再確認

send("AT")

if !waitFor("OK", 3*time.Second) {

println("AT after reset failed")

return

}


// --------------------

// ステーションモード

// --------------------

send("AT+CWMODE=1")

if !waitFor("OK", 3*time.Second) {

println("CWMODE failed")

return

}


// --------------------

// WiFi接続

// --------------------

send(`AT+CWJAP="Buffalo-2G-8340","636nsa535ds3v"`)


// ★ busy p... の後に OK が出れば成功

if !waitFor("OK", 30*time.Second) {

println("WiFi connect failed")

return

}


println("\nWiFi Connected!")


for {

time.Sleep(10 * time.Second)

}

}

-----------ntp問い合わせ成功--------------------------------------------------

package main


import (

"machine"

"time"

)


var uart = machine.UART0

var buf = make([]byte, 1024)


// ====================

// UART送信

// ====================

func send(cmd string) {


println("\n>> " + cmd)


for i := 0; i < len(cmd); i++ {

uart.WriteByte(cmd[i])

}


uart.WriteByte('\r')

uart.WriteByte('\n')

}


// ====================

// RAW送信

// ====================

func sendRaw(data []byte) {


for i := 0; i < len(data); i++ {

uart.WriteByte(data[i])

}

}


// ====================

// contains

// ====================

func contains(s, sub string) bool {


if len(sub) == 0 {

return true

}


if len(s) < len(sub) {

return false

}


for i := 0; i <= len(s)-len(sub); i++ {


match := true


for j := 0; j < len(sub); j++ {


if s[i+j] != sub[j] {

match = false

break

}

}


if match {

return true

}

}


return false

}


// ====================

// waitFor

// ====================

func waitFor(expect string, timeout time.Duration) (bool, string) {


start := time.Now()


data := ""


for time.Since(start) < timeout {


n, _ := uart.Read(buf)


if n > 0 {


part := string(buf[:n])


print(part)


data += part


if contains(data, expect) {

return true, data

}

}


time.Sleep(10 * time.Millisecond)

}


return false, data

}


// ====================

// cmd

// ====================

func cmd(command string, expect string, timeout time.Duration) bool {


send(command)


ok, _ := waitFor(expect, timeout)


return ok

}


// ====================

// NTP parse

// ====================

func parseNTP(packet []byte) uint32 {


secs :=

uint32(packet[40])<<24 |

uint32(packet[41])<<16 |

uint32(packet[42])<<8 |

uint32(packet[43])


return secs - 2208988800

}


// ====================

// main

// ====================

func main() {


// UART

uart.Configure(machine.UARTConfig{

BaudRate: 115200,

TX:       machine.GPIO0,

RX:       machine.GPIO1,

})


time.Sleep(5 * time.Second)


println("UART READY")


// --------------------

// AT

// --------------------

if !cmd("AT", "OK", 3*time.Second) {

return

}


// --------------------

// RESET

// --------------------

send("AT+RST")


time.Sleep(5 * time.Second)


waitFor("ready", 5*time.Second)


// --------------------

// WIFI MODE

// --------------------

if !cmd("AT+CWMODE=1", "OK", 3*time.Second) {

return

}


// --------------------

// WIFI CONNECT

// --------------------

send(`AT+CWJAP="Buffalo-2G-8340","636nsa535ds3v"`)


ok, _ := waitFor("WIFI GOT IP", 40*time.Second)


if !ok {


println("WiFi FAIL")


return

}


waitFor("OK", 10*time.Second)


println("\nWiFi Connected!")


// --------------------

// UDP START

// --------------------

send(`AT+CIPSTART="UDP","ntp.nict.jp",123`)


ok, _ = waitFor("OK", 10*time.Second)


if !ok {


println("UDP FAIL")


return

}


println("\nUDP CONNECTED")


// --------------------

// NTP PACKET

// --------------------

var ntp [48]byte


ntp[0] = 0x1B


// --------------------

// SEND LENGTH

// --------------------

send("AT+CIPSEND=48")


ok, _ = waitFor(">", 5*time.Second)


if !ok {


println("SEND PREP FAIL")


return

}


// --------------------

// SEND DATA

// --------------------

sendRaw(ntp[:])


ok, _ = waitFor("SEND OK", 5*time.Second)


if !ok {


println("SEND FAIL")


return

}


println("\nNTP REQUEST SENT")


// --------------------

// RECEIVE

// --------------------

start := time.Now()


data := make([]byte, 0)


for time.Since(start) < 10*time.Second {


n, _ := uart.Read(buf)


if n > 0 {


// 表示

print(string(buf[:n]))


// 保存

for i := 0; i < n; i++ {

data = append(data, buf[i])

}


// +IPD探索

for i := 0; i < len(data)-5; i++ {


// ':' 探索

if data[i] == ':' {


// ':' の後ろに48byteあるか

if i+1+48 <= len(data) {


packet := data[i+1 : i+1+48]


unixTime := parseNTP(packet)


println("\n===== UNIX TIME =====")

println(unixTime)


jst := unixTime + 9*3600


println("\n===== JST UNIX TIME =====")

println(jst)


println("========================")


for {

time.Sleep(time.Second)

}

}

}

}

}


time.Sleep(10 * time.Millisecond)

}


println("NTP TIMEOUT")

}

2026年5月11日月曜日

tinygo on raspico/w

https://github.com/neildavis/pi_pico_tinygo_examples はpico用 picow用は以下

git cloneでhttps://github.com/soypat/cyw43439/、念の為cyw43439でgo mod tidy

seigojp@fseigojp-PC-LS700RSR-E3:~/cyw43439/examples/cywnet/credentials$ ls

credentials.go  password.text  ssid.text

fseigojp@fseigojp-PC-LS700RSR-E3:~/cyw43439/examples/cywnet/credentials$ cat password.text 

************

fseigojp@fseigojp-PC-LS700RSR-E3:~/cyw43439/examples/cywnet/credentials$ cat ssid.text 

Buffalo-2G-8340

で設定したのちreadmeにあるとおり

 tinygo version 0.35.0 linux/amd64 (using go version go1.23.8 and LLVM version 18.1.2)

fseigojp@fseigojp-PC-LS700RSR-E3:~/cyw43439/examples/dhcp$ go version

go version go1.23.8 linux/amd64

の条件で

https://github.com/soypat/cyw43439/tree/main#:~:text=tinygo%20flash%20%2Dtarget%3Dpico%20%2Dstack%2Dsize%3D8kb%20%2Dscheduler%3Dtasks%20%2Dmonitor%20%20./examples/blinky で成功

詳しくは https://github.com/soypat/cyw43439/tree/mainを参照してください



2026年5月6日水曜日

kallumajs and color-oled/kaluma http and node express

color oled 成功(ssd1306)

npm i https://github.com/niklauslee/ssd1306 してnode_modules/examples/

に入りkaluma flash ./ex _128x128.js --bundleで成功 うれしい

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

https://javascript.plainenglish.io/physical-computing-with-javascript-8-8-connecting-to-internet-151ba3dfce59にある例題  まずdht,exp8266-httpをnpm install(kalumajsサイトpackages参考)

kalumaはfirwareこわれやすいのでkaluma flash ./index.js --bundle で止まる時は入れ直す

node app.jsで頓死おこるならPC再起動ポート番号も変更せんといかんときもある

--------nodejs-------app.js--------node app.js--で先に起動

const express = require('express');

const ip = require('ip');


const app = express();

const addr = ip.address();

const port = 3000;


let temperature = '0.0';

let humidity = '0';


app.get('/update', (req, res) => {

  if (req.query.t) temperature = req.query.t;

  if (req.query.h) humidity = req.query.h;

  res.status(200).send('OK');

});


app.get('/', (req, res) => {

  res.setHeader('Content-Type', 'text/html');

  res.send(`

<html>

  <body>

   <h1>${temperature}</h1>

   <h1>${humidity}</h1>

  </body>

</html>

  `);

});


app.listen(port, () => {

  console.log(`Server running at http://${addr}:${port}`);

});

-----kalumajs--index.js---flash後にkaluma shellで.load----

const { DHT } = require('dht');

const { ESP8266HTTPClient } = require('esp8266-http-client');


// 設定

const WIFI_SSID = 'Buffalo-2G-8340';

const WIFI_PASSWORD = '636nsa535ds3v';


const ADDRESS = '192.168.11.8';

const PORT = '3001';


// DHT11

const dht = new DHT(15, DHT.DHT11);


// ESP8266

const esp = new ESP8266HTTPClient();


function start() {


  setInterval(() => {


    try {


      dht.read();


      let t = dht.temperature.toFixed(1);

      let h = dht.humidity.toFixed(0);


      console.log(`TEMP=${t} HUM=${h}`);


      const url =

        `http://${ADDRESS}:${PORT}/update?t=${t}&h=${h}`;


      console.log(url);


      esp.http(url)

        .then(res => {

          console.log('send ok');

        })

        .catch(err => {

          console.log('http error');

          console.log(err);

        });


    } catch(err) {


      console.log('dht error');

      console.log(err);


    }


  }, 10000);


}


// WiFi接続

esp.wifi(WIFI_SSID, WIFI_PASSWORD)

  .then(() => {


    console.log('wifi connected');


    start();


  })

  .catch(err => {


    console.log('wifi connect failed');

    console.log(err);


  });

2026年5月5日火曜日

開発系まとめ(platformなど)

https://docs.sunfounder.com/projects/kepler-kit/ja/latest/pyproject/for_micropython_user.html#iot :: raspberry py picow mpy

https://docs.sunfounder.com/projects/elite-explorer-kit/ja/latest/components/component_uno.html  :: arduino uno r4 wifi

https://docs.sunfounder.com/projects/esp32-starter-kit/ja/latest/?utm_source=chatgpt.com ::  esp32

https://randomnerdtutorials.com/projects-esp8266/ :: esp8266 ただし英語。。。

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

esp32はIDE1.8は遅くplatformIOが推奨(差分コンパイルなしのせいかだろう)

https://qiita.com/nextfp/items/f54b216212f08280d4e0にesp32 devkitcが詳述されている

unoR3/esp8266はIDE1.8は差分コンパイルなしだがコンパイルそこそこ早いので使用OK

unoR4はIDE2.3が必須、ubuntu では 

./arduino-ide_2.3.6_Linux_64bit.AppImage  --no-sandbox で!

2026年5月4日月曜日

Tinygo on windows11(unoR3)

 https://github.com/neildavis/pi_pico_tinygo_examples for pico

https://github.com/soypat/cyw43439/tree/main for picow

上記は例題サイト

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

wslでないやりかた 簡単だった

https://qiita.com/ysaito8015@github/items/148a28ee20f5a48d3cb8

for /F "tokens=*" %x in ('tinygo env TINYGOROOT') do dir %x\src\examples

上記はcmdでないと動かんかった

tinygo targets    で       arduino-uno だった 

すでにArduino IDEある場合

avrdudeの場所をPATHに追加

典型パス(例):

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin

または新しいIDEだと: 私のは、こっちだった

C:\Users\ユーザー名\AppData\Local\Arduino15\packages\arduino\tools\avrdude\...\bin


tinygo flash --target=arduino-uno main.go で成功