2025年2月16日日曜日

raspberry pi and legacy cam / gpiozero

 

Raspberry Pi(ラズパイ)のOSが32ビットか64ビットかを確認するには、コマンド「lsb_release -a」を使用します
【確認方法】
  1. コマンド「lsb_release -a」を実行します。
また、OSが対応するbitを確認するには「getconf LONG_BIT」を使用します。


bullseye 32bitにはraspistillが入っていたが


RasTech Raspberry Pi カメラモジュール Raspberry Pi カメラ 500万画素 Raspberry Pi 5/4B/3B+/3B/2B+/ZERO1.3/ZERO 2W/ZERO W for Raspberry Pi クリアスタンド*1、リボンケーブル*3

https://qiita.com/yamatonori/items/019d05a19b206cbcf571 によればOV5647センサー

でLIBCAMERAを使う準備をして成功 VNCでも動いた

https://hellobreak.net/raspberry-pi-bullseye-libcamera/ に説明が詳しい

-----------------about gpiozero---------------------------------------------------------------------------------------------

https://gpiozero.readthedocs.io/en/latest/recipes.html#led 英語
https://www.denshi.club/ 日本語

2025年2月11日火曜日

obnizスマホ両指操作など( https://blog.obniz.com/make/kids-project-simple-rc-car )

https://thunderblog.org/2019/02/obniz-rc.html これすぐれものサイト

https://docs.obniz.com/ja/guides/obniz-starter-kit/iot-by-html-and-javascript/browser-button-and-servo-motor :: オブニズJs例題 servo motor

https://docs.obniz.com/ja/sdk/parts/DCMotor/README.md

:: ⚠obnizBoard/obnizBoard1YにDCMotorをつなぐときは、obnizBoard/obnizBoard1Y電源供給はPCなどには繋がないでください。ノイズ等によりPCが破損する恐れがあります。

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

<html> <head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>

<link

rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"
integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB"
crossorigin="anonymous"
/>
<script
src="https://unpkg.com/obniz@3.x/obniz.js"
crossorigin="anonymous"
></script>
</head>
<body>
<br />
<button
id="lf"
class="btn btn-warning"
style="width:45%;height:100px;font-size:50px;"
>
</button>
<button
id="rf"
class="btn btn-warning"
style="width:45%;height:100px;font-size:50px;"
>
</button>
<br />
<br />
<button
id="lb"
class="btn btn-primary"
style="width:45%;height:100px;font-size:50px;"
>
</button>
<button
id="rb"
class="btn btn-primary"
style="width:45%;height:100px;font-size:50px;"
>
</button>
<script>
let obniz = new Obniz("4998-4317");
obniz.onconnect = async () => {
let motorA = obniz.wired("DCMotor", { forward: 3, back: 2 });
motorA.power(40); // pwm? maybe....
let motorB = obniz.wired("DCMotor", { forward: 0, back: 1 });
motorB.power(40);

$("#lf").on("touchstart mousedown", () => {
motorA.move(true);
}); // during event , front on
$("#lf").on("touchend mouseup", () => {
motorA.stop();
});
$("#lb").on("touchstart mousedown", () => {
motorA.move(false);
}); // during event , back on
$("#lb").on("touchend mouseup", () => {
motorA.stop();
});

$("#rf").on("touchstart mousedown", () => {
motorB.move(true);
});
$("#rf").on("touchend mouseup", () => {
motorB.stop();
});
$("#rb").on("touchstart mousedown", () => {
motorB.move(false);
});
$("#rb").on("touchend mouseup", () => {
motorB.stop();
});
};

</script>
</body>
</html>

2025年2月3日月曜日

esp32-cam / esp01(dcm,static IPの怪の解決に成功はしたが?)

esp32-camでexampleのcamera web serverに以下の手段でstatic addressを振って成功

ただしesp32-wroverにするだけでは不足で①#define CAMERA_MODEL_AI_THINKERを

有効にして、もとの設定をコメントアウトする②partition schemaをhugeにする必要あり

以下は①②がデフォルトでそうなってるっぽいが困ったら上記を参照すること!

https://randomnerdtutorials.com/projects-esp32-cam/ でesp32-wroverを選んで

esp32-cam robot うごくが通信不安定 電源問題かもしれない。。。。

このコードはstation modeなので、softapもいずれ。。。。たぶんいらんな(以下参照)

おなじsiteのvideo streaming web serverのコードに

  IPAddress local_IP(192,168,43,160);

  IPAddress gateway(192,168,43,1);

  IPAddress subnet(255,155,0,0);

  IPAddress primaryDNS(8,8,8,8);

  IPAddress secondaryDNS(8,8,4,4);

  if(!WiFi.config(local_IP,gateway,subnet,primaryDNS,secondaryDNS)){

    Serial.println("STA failed to configure");

  }

の数行を  

  WiFi.begin(ssid, password);

 の前におくとstatic addressが振られる!


--------arecore no1---------------------------------------

 txdはgpio1,rxdはgpio3だった

以下はdrv8833のPWMでないコード まずは成功したので残すが、arecore noo2に

後述したようにモータはサーボもDCも一個だけしかつかえんようだ。。。。

#define VIN1 1

#define VIN2 3

void setup() 

{

  pinMode(VIN1, OUTPUT);

  pinMode(VIN2, OUTPUT);

   //analogWriteFreq(1000);

   //analogWriteRange(1000);

}


void loop()

{

  int i = 0;


  //正回転

  digitalWrite(VIN1, LOW);

  digitalWrite(VIN2,HIGH);

  //回転速度を上げる

  //for(i = 0; i < 1000; i ++)

 // {

   // analogWrite(VIN1, i);

    //delay(10);

  //}

  delay(500);

  digitalWrite(VIN1,HIGH);

  digitalWrite(VIN2,HIGH);

  delay(500);

  digitalWrite(VIN1,HIGH);

  digitalWrite(VIN2,LOW);

  //回転速度を上げる

  //for(i = 0; i < 1000; i ++)

 // {

   // analogWrite(VIN1, i);

    //delay(10);

  //}

  delay(500);

  digitalWrite(VIN1,HIGH);

  digitalWrite(VIN2,HIGH);

  delay(500);

  //回転速度を下げる

  //for(i = 0; i < 1000; i ++)

  //{

  //  analogWrite(VIN1, 0xff - i);

  //  delay(10);

  //}


  //逆回転

  //digitalWrite(VIN1, LOW);


  //回転速度を上げる

  //for(i = 0; i < 1000; i ++)

  //{

//    analogWrite(VIN2, i);

  //  delay(10);

  //}


  //回転速度を下げる

  //for(i = 0; i < 1000; i ++)

  //{

   // analogWrite(VIN2, 0xff - i);

  //  delay(10);

  //}

}

------------arecore no1---------------static ip -----------------------------------

https://teramorosu.hatenablog.com/entry/2016/10/23/163640でうまく設定できない

https://qiita.com/wamisnet/items/e2aea81f7f800a262be6を参考に改変

以下に成功 

ただしmotor2個につかうために0,2,1,3の組み合わせを使うも失敗

当然サーボ1個とモータ1個の同時制御も不成功

esp8266で再挑戦したら、あっさり成功 esp01では供給電流がたりんようだ

#include <WiFiClient.h>

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#define LED 13                    //LED点灯に使用するピン

ESP8266WebServer server(80);


void onroot() {

    String msg ;

    msg += "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><title>LED Button</title></head><body>";

    msg += "<script>";

    msg += "function sendOn(){" ;

    msg += "send(\"/on/\");";

    msg += "document.getElementById(\"LEDstatus\").innerHTML=\"ON!\";";

    msg += "}";

    msg += "function sendOff(){";

    msg += "send(\"/off/\");";

    msg += "document.getElementById(\"LEDstatus\").innerHTML=\"OFF!\";";

    msg += "}";

    msg += "function send(url){";

    msg += "var xhr = new XMLHttpRequest();";

    msg += "xhr.open(\"GET\", url, true);";

    msg += "xhr.send();";

    msg += "}";

    msg += "</script>";

    msg += "<button id=\"on\" onClick=sendOn()>LED ON</button>";

    msg += "<button id=\"off\" onClick=sendOff()>LED OFF</button>";

    msg += "<p id=\"LEDstatus\"></p>";

    msg += "</body></html>";


    server.send(200, "text/html", msg);

}


void LedOn(){

  Serial.println("ON");

  digitalWrite(LED,HIGH);

  server.send(200, "text/html","OK");

}


void LedOff(){

  Serial.println("OFF");

  digitalWrite(LED,LOW);

  server.send(200, "text/html","OK");

}


void setup() {


    pinMode(LED, OUTPUT);


    Serial.begin(115200);

    Serial.println("");

    Serial.println("ESP8266 Wifi test");


    // WiFi.config(IPAddress(192, 168, 43, 160), WiFi.gatewayIP(), WiFi.subnetMask());

  WiFi.config(IPAddress(192,168,43,160),IPAddress(192,168,43,1),\

     IPAddress(255,255,255,0)); // これで成功した

    WiFi.begin("HUAWEI@nova@lite@3+","99991111");

    WiFi.mode(WIFI_STA);


    while (WiFi.status() != WL_CONNECTED) {

        delay(500);

        Serial.print(".");

    }


    Serial.println("");

    Serial.print("Connected as ");

    Serial.println(WiFi.localIP());


    // Web server setting

    server.on("/", onroot);

    server.on("/on/", LedOn);

    server.on("/off/", LedOff);

    server.begin();

}


void loop() {

    server.handleClient();

}

2025年1月27日月曜日

Micro:bit and ble (キースタジオand回転サーボ)

以下が成功コード let input2...はinputにするとエラーとなる、理由不明

https://zenn.dev/ha864zenn/books/how-to-make-biped-robot/viewer/communicating-via-bluetooth :: micro:bit ble pedia

 https://monomonotech.jp/kurage/webbluetooth/microbit_ble_setting.html :: microbitV2 ble

https://qiita.com/nanbuwks/items/75ac24912d9bbe84d80f ble send

https://qiita.com/youtoy/items/46502b9bd17fad16d427 ble receive

https://monomonotech.jp/kurage/webbluetooth/microbit_ble_block_uart_rx.html ble receive

bluetooth.onBluetoothConnected(function () {

basic.showIcon(IconNames.Heart)
basic.pause(1000)
basic.clearScreen()
})
function backward () {
pins.analogWritePin(AnalogPin.P1, 600)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.analogWritePin(AnalogPin.P2, 600)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(500)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
}
bluetooth.onUartDataReceived(serial.delimiters(Delimiters.NewLine), function () {
input2 = bluetooth.uartReadUntil(serial.delimiters(Delimiters.NewLine))
if (input2.includes("f")) {
basic.showString(input2)
forward()
} else if (input2.includes("b")) {
basic.showString(input2)
backward()
}
})
function forward () {
pins.analogWritePin(AnalogPin.P1, 600)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.analogWritePin(AnalogPin.P2, 600)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
}
let input2 = ""
bluetooth.startUartService()
pins.digitalWritePin(DigitalPin.P14, 1)
ーーーーーーーーーーーーーーーーーーーーーーーー
これを単独でうごかすには大容量バッテリ(3A出力2個口)が必要!
bluetooth.onBluetoothConnected(function () {
basic.showIcon(IconNames.Heart)
basic.pause(1000)
basic.clearScreen()
})
function backward () {
pins.servoWritePin(AnalogPin.P0, 103)
pins.servoWritePin(AnalogPin.P3, 58)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 90)
pins.servoWritePin(AnalogPin.P3, 90)
}
bluetooth.onUartDataReceived(serial.delimiters(Delimiters.NewLine), function () {
input2 = bluetooth.uartReadUntil(serial.delimiters(Delimiters.NewLine))
if (input2.includes("f")) {
basic.showString(input2)
forward()
} else if (input2.includes("b")) {
basic.showString(input2)
backward()
}
})
function forward () {
pins.servoWritePin(AnalogPin.P0, 58)
pins.servoWritePin(AnalogPin.P3, 103)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 90)
pins.servoWritePin(AnalogPin.P3, 90)
}
let input2 = ""
bluetooth.startUartService()
pins.servoWritePin(AnalogPin.P0, 90)
pins.servoWritePin(AnalogPin.P3, 90)


2025年1月26日日曜日

raspberry pi ヴィデオ関連 /Micro:bit keyestudioで無線操縦

 

-----------ラズパイ----------------------------------------

zero は2になっても2GしかWifi未対応 3a+は5Gも対応している

install時のusキーボード配列は、起動後にraspi-configでjpキーボードに変更できた

https://mail.google.com/mail/u/0/?tab=rm&ogbl#inbox 

gpiozero で 直感的にデバイスを制御する



https://ponkichi.blog/mjpg-streamer/ これも参考にして以下を

https://raspi-katsuyou.com/index.php/2020/06/30/11/10/44/644/
 これはブルーバックスと同じだが、ブルーバックスは
 全コマンドを/opt以下にmvしたので、10-02-stream.shを使用!

単純にヴィデオクリップするのならguvcviewがいい パイカメラの場合はv4l2が必要?
USBウェブカメラ(マイク付き)なら録音もできるからベターかも

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0303

https://mekou.com/linux-magazine/web%e3%82%ab%e3%83%a1%e3%83%a9%e6%92%ae%e5%bd%b1guvcview/
以上2個は同上

--------------キースタジオモータボードで無線操縦(サバクラ共通)--------------------------------

input.onButtonPressed(Button.A, function () {
radio.sendString("f")
})
input.onButtonPressed(Button.AB, function () {
radio.sendString("t")
})
input.onButtonPressed(Button.B, function () {
radio.sendString("b")
})

radio.setGroup(132)
pins.digitalWritePin(DigitalPin.P14, 1)
basic.showIcon(IconNames.Heart)

radio.onReceivedString(function (receivedString) {
basic.showString(receivedString)
if (receivedString == "f") {
basic.showLeds(`
. . # . .
. # # # .
# . # . #
. . # . .
. . # . .
`)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
} else if (receivedString == "b") {
basic.showLeds(`
. . # . .
. . # . .
# . # . #
. # # # .
. . # . .
`)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(500)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
} else if (receivedString == "t") {
basic.showLeds(`
# # # # .
# . . # .
# . . # .
# . # # #
# . . # .
`)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(500)
pins.analogWritePin(AnalogPin.P1, 1023)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.analogWritePin(AnalogPin.P2, 1023)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)
}
})


参考 キースタジオ詳細は以下に

https://wiki.keyestudio.com/Ks0308_keyestudio_Motor_Drive_Breakout_Board_for_micro_bit

このサイトのコードをjsですると


digitalWritePin(DigitalPin.P14, 1)

basic.forever(function () {

    pins.analogWritePin(AnalogPin.P1, 600)

    pins.digitalWritePin(DigitalPin.P13, 1)

    pins.digitalWritePin(DigitalPin.P12, 0)

    pins.analogWritePin(AnalogPin.P2, 600)

    pins.digitalWritePin(DigitalPin.P15, 1)

    pins.digitalWritePin(DigitalPin.P16, 0)

    basic.pause(500)

    pins.digitalWritePin(DigitalPin.P13, 0)

    pins.digitalWritePin(DigitalPin.P12, 0)

    pins.digitalWritePin(DigitalPin.P15, 0)

    pins.digitalWritePin(DigitalPin.P16, 0)

    basic.pause(500)

})

_keyestudio_Motor_Drive_Breakout_Board_for_micro_bit

2025年1月25日土曜日

obniz and ArduCamMini

 --

https://iot-gym.com/arducammini-obniz/ を基本とするがakizukiの取り扱い品が

mini-2m から mini-2m-plusになっていたので、以下のサイトを参照する

なお上サイトのようにvccを抜くのはいかんようだ。。。。

https://qiita.com/y-hira/items/0a1f4a69f1b1e858a916  のようにすべてつなぐ

それでもlow voltageとアラームでて画面がでない、単3x3をVCC、GNDに追加してでた

それでも画面は緑がかって。。。。

繰り返すが本サイトの修正が必須! 

ストリーム表示でも同様だ! 

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@latest/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<img id="image">

<script>
var obniz = new Obniz("4998-4317"); //obnizIDを入力する
obniz.onconnect = async function () {
var cam = obniz.wired("ArduCAMMini", { cs:0, mosi:1, miso:2, sclk:3, gnd:4, vcc:5, sda:6, scl:7 });
await cam.startupWait();
const data = await cam.takeWait('320x240'); // これでも写真がでるのが結構遅い
 //'160x120'or'176x144'or'320x240'or'352x288'or'640x480'or'800x600'or'1024x768'or'1280x960'or'1600x1200'を指定する
data.unshift(255); // ここが重要!
console.log("image size = " + data.length + " bytes");
 // 以下の理解のためには https://edge.sincar.jp/web/base64-inline-image/ に詳しい書式説明あり
const base64 = cam.arrayToBase64(data);
document.getElementById("image").src = "data:image/jpeg;base64, " + base64;
}
</script>
</body>
</html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>

<script src="https://unpkg.com/obniz@latest/obniz.js"></script>

</head>

<body>

<div id="obniz-debug"></div>

<img id="image">

<script>

var obniz = new Obniz("5312-1232");  //obnizIDを入力する

obniz.onconnect = async function () {

  var cam = obniz.wired("ArduCAMMini", { cs:0, mosi:1, miso:2, sclk:3, gnd:4, vcc:5,sda:6, scl:7 });

  await cam.startupWait();

  while (true) { //これでストリームとなる

  const data = await cam.takeWait('160x120'); //'160x120'or'176x144'or'320x240'or'352x288'or'640x480'or'800x600'or'1024x768'or'1280x960'or'1600x1200'を指定する

   data.unshift(255); 

  console.log("image size = " + data.length + " bytes");

  const base64 = cam.arrayToBase64(data);

  document.getElementById("image").src = "data:image/jpeg;base64, " + base64;

 }

}

</script>

</body>

</html>

これでストリームもいけた

2025年1月24日金曜日

有用サイト一覧

 https://www.petitmonte.com/ プチモンテ uno&wroom

https://omoroya.com/ おもろ家 uno&kit-oscilo

https://sanuki-tech.net/  さぬきテックネット micro:bit 

https://hellobreak.net/ メタエレ実験室 picoとraspi

esp系はrandom nerd tutorialが一番(picoもある)

obnizは本社サイトが一番 

http://www.picfun.com/  後閑さん PICの神様

意外とないのがpicow.....以下に

https://sozorablog.com/raspberry-pi-pico-w-review/