2022年5月26日木曜日

uart latest:: PC->UNO,UNO->ESPR2 バイブル改変

TERATERMは以下を参照https://www.blogger.com/blog/post/edit/7870955253680497274/2387149773725564929

----- ubuntu with uno -----------------------------------------------------

amazon手持ちのrtcはespr developperではうまくいかんのでarduinoからuartでおくる!

sdcもそうするつもり! 両者は鬼門のようだ。

そのまえに以下をもとにUARTを体験(https://okchan08.hateblo.jp/entry/2019/01/27/2343039)

const int LED_PIN = 13;

  void setup(){

   Serial.begin(9600);                // シリアル通信の開始(ボーレート9600bps)

   pinMode(LED_PIN, OUTPUT);

}

 void loop(){

   while(Serial.available() > 0){    // 入力された文字が何バイトか調べ

     int val = Serial.read();        // 1バイト分のデータを読み取る

     if(val == '1'){                 // "1"ならLEDを点灯,"0"ならLEDを消灯

       digitalWrite(LED_PIN, HIGH);

     } else if(val == '0'){

       digitalWrite(LED_PIN, LOW);

     }

   }

}

で、RX,TX,GNDをつないでGTKTERMを起動 PORT,BAUD=9600を指定

LOCAL ECHO,CR LF AUTOをセットする 1をいれるとledオン!

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

unoはハードシリアル1個だけ、esp2も同様のようだ なおesp8266 code は

esp32バイブルのesp32 code の改変である ボタンを押している間だけ光る!

まずunoは以下 
#include <SoftwareSerial.h>
#define SW_PIN 2
#define RX_PIN 3
#define TX_PIN 4

// 3番ピン(受信)/4番ピン(送信)でソフトウェアシリアルを行う
SoftwareSerial Serial2(RX_PIN, TX_PIN);

int sw_stat;

void setup() {
  Serial.begin(115200);          // シリアルモニタの初期化
  Serial2.begin(9600);           // ソフトウェアシリアルの初期化
  pinMode(SW_PIN, INPUT_PULLUP); // スイッチのピンを入力用にする、もう一方はGndへ
  sw_stat = HIGH;                // スイッチが押されていないことにする
}

void loop() {
  int sw;

  sw = digitalRead(SW_PIN);     // スイッチのピンの値を読み取る
  if (sw != sw_stat) {          // スイッチの状態が変化したかどうかを調べる
    sw_stat = sw;               // スイッチの状態を更新する
    if (sw == LOW) {            // スイッチが押された場合
      Serial.println("On");     // シリアルモニタに「On」と出力
      Serial2.print("on");      // ESP32に「on」を送信
    }
    else {                      // スイッチが離された場合
      Serial.println("Off");    // シリアルモニタに「Off」と出力
      Serial2.print("off");     // ESP32に「off」を送信
    }
  }
}

Espr developperは以下、ハードのtx,rxとクロス接続する
gndは共通化する必要ありと思われる
Espr developperでもserial monitorするので3vをunoから取ってはいけない
#include <SoftwareSerial.h>
#define Rx 12
#define Tx 13
#define LED_PIN 2
SoftwareSerial Serial2(Rx,Tx);
void setup() {

Serial.begin(115200); // for monitor
  Serial2.begin(9600);      // Serial2を初期化
  pinMode(LED_PIN, OUTPUT); // LEDを消灯
}

void loop() {
  String str;

  if (Serial2.available()) {       // Serial2にデータを受信している?
    str = Serial2.readString();    // 受信した文字列を変数strに代入
Serial.println(str);
    if (str.equals("on")) {        // 受信した文字列が「on」の場合
      digitalWrite(LED_PIN, HIGH); // LEDを点灯する
    }
    else if (str.equals("off")) {  // 受信した文字列が「off」の場合
      digitalWrite(LED_PIN, LOW);  // LEDを消灯する
    }
  }
}



2022年5月24日火曜日

DRV8835(microbit,espr2,arduino,raspico/ble)

--------- microbit -----------------
radio.onReceivedNumber(function (receivedNumber) {
if (receivedNumber == 0) {
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P13, 0)
basic.pause(500)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
} else {
if (receivedNumber == 1) {
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 1)
basic.pause(500)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P13, 0)
}
}
})
input.onButtonPressed(Button.A, function () {
radio.sendNumber(0)
})
input.onButtonPressed(Button.AB, function () {
music.startMelody(music.builtInMelody(Melodies.Ringtone), MelodyOptions.Once)
})
input.onButtonPressed(Button.B, function () {
radio.sendNumber(1)
})
radio.setGroup(1)

-------------espr2-------------------------------------------------------
espr developper  で3v3からdrv8835のvccにつなぐのでOKです
const int MORTOR1_PIN = 13; for espr const int MORTOR2_PIN = 15 ; for espr void setup() { // put your setup code here, to run once: pinMode(MORTOR1_PIN,OUTPUT); pinMode(MORTOR2_PIN,OUTPUT); } void loop() { // put your main code here, to run repeatedly: digitalWrite(MORTOR1_PIN,HIGH); digitalWrite(MORTOR2_PIN,LOW); delay(2000); digitalWrite(MORTOR1_PIN,HIGH); digitalWrite(MORTOR2_PIN,HIGH); delay(2000); }
------------------------------------------------------
プチモンテでDRV8835をためしたがDCモーターの使い方 DRV8835版 [Arduino] (petitmonte.com)

間違い発見! ここでも順逆の間にブレーキをいれんとあかんかった なんでかしらんけど
  1. // 回転速度(35-255)
  2. // ※値が大きいほど高速,余りにも小さい値は回転しません。
  3. const uint8_t speeds = 48;
  4.  
  5. void setup() {
  6. Serial.begin(9600);
  7. }
  8. void loop() {
  9. // 正転(回転)
  10. Serial.println("正転");
  11. analogWrite(10,speeds);
  12. analogWrite(11,0);
  13. delay(1000);
  14.  
  15. // ブレーキ
  16. Serial.println("ブレーキ");
  17. analogWrite(10,speeds);
  18. analogWrite(11,speeds);
  19. delay(1000);

  20. // 逆転(逆回転)
  21. Serial.println("逆転");
  22. analogWrite(10,0);
  23. analogWrite(11,speeds);
  24. delay(1000);
  25. // ブレーキ
  26. Serial.println("ブレーキ");
  27. analogWrite(10,speeds);
  28. analogWrite(11,speeds);
  29. delay(1000);
  30. }
ーーーーーーーーーーarduinoーーーーーーーーーーーーーーーーーーーーーーーーーー
下記のように前進停止後退停止としないとスムーズにいかん、なんでやろね

from machine import Pin,UART
import time
led = machine.Pin(15,Pin.OUT) なくてもいいが。。。
IN1=Pin(2,Pin.OUT)
IN2=Pin(3,Pin.OUT)

while True:
     
            print("foward")
            led.value(1)
            time.sleep(1)
            led.value(0)
            IN1.value(1)
            IN2.value(0)
            time.sleep(1)
       
            print("stop")
            led.value(1)
            time.sleep(1)
            led.value(0)
            IN1.value(0)
            IN2.value(0)
            time.sleep(1)
       
            print("back")
            led.value(1)
            time.sleep(1)
            led.value(0)
            IN1.value(0)
            IN2.value(1)
            time.sleep(1)
           
            print("stop")
            led.value(1)
            time.sleep(1)
            led.value(0)
            IN1.value(0)
            IN2.value(0)
            time.sleep(1)

上のコードを援用して、ブルーツースモジュールと組み合わせたら、うまくいった うえをなぞった
rom machine import Pin,UART
import time

uart=UART(0,9600,tx=Pin(0),rx=Pin(1))
IN1=Pin(2,Pin.OUT)
IN2=Pin(3,Pin.OUT)

while True:
        c = uart.readline()
        if c == b'f':
            print("foward")
            IN1.value(1)
            IN2.value(0)
            time.sleep(1)
            IN1.value(0)
            IN2.value(0)
            time.sleep(1)
        if c == b'b':
            print("back")
            IN1.value(0)
            IN2.value(1)
            time.sleep(1)
            IN1.value(0)
            IN2.value(0)
            time.sleep(1)
  

2022年5月22日日曜日

obniz memo③ ifttt,webhook/periodic/switch/power,tensorflow,air-con,sleep

 https://blog.obniz.com/make/saving-temperature-logger-1y   :: ifttt app

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

https://qiita.com/youtoy/items/668ffd93f6dea3d7a2de webhook 実行

----------------------テンソルフロ---------------------------------------------------------

https://blog.obniz.com/make/move-the-servomotor-tilt-the-head に成功

index.html,code.jsをPCにおいてルン tensorflowのposenetというライブラリ利用の例

-------------------------エアコン---------------------------------------------------------

https://www.kodomonokagaku.com/experience/programming/9416/

https://www.kodomonokagaku.com/experience/programming/9769/

どうも、これ以外のやりかたはうまくいかんかったが、いまはできんくなった

結局スイッチボットをこうた

ーーーーースリープーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これにアプリ設定で、デバイスがオンライン時に実行のみにチェックを入れると

3分ごとに起きてアプリステータスに計測結果を表示する jsでどう書くのか?

---------------------------------- sleep by js is as below -------------------------------

<html> 定期みずやり まず一回はアプリ実行が必要 settimeout,cleartimeout.....?

<script>
let obniz = new Obniz("OBNIZ_ID_HERE");
//Timeout 25s
let tid = setTimeout(() => {
obniz.sleepMinute(3);
}, 25000);
obniz.onconnect = async () => {
let motor = obniz.wired("DCMotor", { forward: 0, back: 1 });
//rotate motor(pump) for 10s
motor.forward();
await obniz.wait(10000); // 10s
motor.stop();
//set to wake up every 3 minutes
obniz.sleepMinute(3);
//program finish wait...
await obniz.wait(1000);
clearTimeout(tid);
if (Obniz.App.isCloudRunning()) {
Obniz.App.done({
status: 'success',
text: 'it is ok'
});
}
};
</html>

2022年5月8日日曜日

ラズパイ400 ②:pwmで音、l293d,adt7310-spi,vnc with nodisp, vnc viewer, webiopi

https://tomosoft.jp/design/?p=8685 が参考になる

Kujiraの本によれば2手法があった wiringpiをつかわないのと使うので後者はルート権限要

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

http://raspitips.de/raspberry-pi-gleichstrommotor-mit-motortreiber-l293d-und-pulsweitenmodulation/ ドイツ語なれど完全にうごいた PWMっぽい

ctl-cで終わらんと暴走する!(単3x3で)単3x4の場合はctl-cで終わっても暴走!

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

adt7310 spi-temp 値を出すのに少し暖気運転が必要みたい 数回目で成功しだした

http://independence-sys.net/main/?p=3834 を参考に配線し 

https://avr.gawakaru.jp/archives/749 を参考にコード実行 このためspice1に結線

import spidev

import time

spi_ch = 1

spi = spidev.SpiDev()

spi.open(0,spi_ch)

spi.max_speed_hz=(100000)   #クロック周波数を設定

spi.xfer2([0x08,0x80])  # センサーを16ビット精度に設定

time.sleep(0.5)

spi.xfer2([0x54]) #連続モードにセット

time.sleep(1) #ADT7410が測定データをAD変換するための時間を待つ

ret = spi.xfer2([0xff,0xff]) #ダミーの2バイトをセンサーに書き込んで2バイトの温度データを読み取る

temp = ret[0]<<8 | ret[1]

temp /= 128.0      #℃に変換

print("temparature:")

print(temp)

print( "stop:")

print(spi.xfer2([0x50])) #連続モードを停止

spi.close()

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

Raspberry Pi 4でディスプレイを繋がずにVNCする - Qiita

-----------------vnc viewer on ubuntu ----------------------------------

https://virment.com/how-to-connect-raspberry-pi-from-ubuntu-by-realvnc/

-------------------wepiopi------------------------------------------------

 http://ww.w.m-ac.jp/raspi/software/webiopi/install/index_j.phtml  webiopiのインスト詳述