2025年1月16日木曜日

esp01/wemos soft-ap wifi-radi-con of motor (using drv8833)

 // https://cotechworks.ltt.jp/2023/06/05/post-668/ を改変

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#define WIFI_SSID "ESP8266-softAP"    /* SSID */

#define WIFI_PWD "12345678"           /* パスワード */

#define AIN0 2

#define AIN1 4

ESP8266WebServer server(80);

IPAddress ip( 192, 168, 0, 1 );         /* ESP8266のIPアドレス */

IPAddress subnet( 255, 255, 255, 0 );   /* サブネットマスク */


void setup() {

  pinMode(AIN0,OUTPUT);

  pinMode(AIN1,OUTPUT);

  /* softAPモードに設定 */

  WiFi.mode(WIFI_AP);

  WiFi.softAPConfig(ip, ip, subnet);

  WiFi.softAP(WIFI_SSID, WIFI_PWD);

 

  server.on("/", []() {

    server.send(

      200,

      "text/html",    

      "<h1>Hello! Web Server!</h1>"

      "Click <a href=\"/F\">forward</a>"

      "</br>"

      "Click <a href=\"/B\">backward</a>");

  });


  server.on("/F", []() {

    digitalWrite(AIN0,HIGH);

    digitalWrite(AIN1,LOW);

    delay(100);

    digitalWrite(AIN0,HIGH);

    digitalWrite(AIN1,HIGH);

    server.send(

      200,

      "text/html",    

      "<h1>Hello! Web Server!</h1>"

      "Click <a href=\"/F\">forward</a>"

      "</br>"

      "Click <a href=\"/B\">backward</a>"); 

   });


   server.on("/B", []() {

    digitalWrite(AIN0,LOW);

    digitalWrite(AIN1,HIGH);

    delay(100);

    digitalWrite(AIN0,HIGH);

    digitalWrite(AIN1,HIGH);

    server.send(

      200,

      "text/html",    

      "<h1>Hello! Web Server!</h1>"

      "Click <a href=\"/F\">forward</a>"

      "</br>"

      "Click <a href=\"/B\">backward</a>"); 

   });

  server.begin();


}


void loop() {

  /* クライアントからアクセスがあった時の処理 */

  server.handleClient();

}


2025年1月9日木曜日

DRV8833 大全 ・ 回転サーボ 

https://tamanegi.digick.jp/computer-embedded/mcuboa/lolin-d1-mini/ に

LOLIN(WEMOS) D1 mini lite の説明があるが、PWMがうまくいかん!

https://burariweb.info/electronic-work/wemos-d1-mini-esp8266-development-board.html#WeMos_D1_mini が手持ちのようだ GPIO16はPWMできんとあった

( pin0とピンをいろいろ組み合わせるが他につないだらできるが順逆とならん。。。。

gpio0以外の組み合わせでは音がするのみ。。むしろESP01でPWMできるのが不思議。。。)

単純なオンオフもgpio0以外をつかわんと順逆とならん 手持ちのWemosが

はずれだった可能性が高い

https://misoji-engineer.com/archives/motordriver-dc.html にくわしいが

MICROPYTHONで解説されている


スタンバイに3.3vを入力するのがポイント 5vでは暴走する!

以下はesp01での話!Wemosではない!

https://tamanegi-digick.com/it/dcmtdrv/#toc30 がARDUINO-IDE

以下のようにanalogWriteは徐々にあげていかんと暴走する? 

そうでもなかった つねにLOWにするサイドはanalogWriteでもdigitalWriteでいい

結局 https://deviceplus.jp/arduino/arduino_f05/ がわかりやすい

ちなみにgpioは0,2と1,3の組み合わせがいい

#define VIN1 0
#define VIN2 2
void setup() 
{
  pinMode(VIN1, OUTPUT);
  pinMode(VIN2, OUTPUT);
}

void loop()
{
  int i = 0;

  //正回転
  digitalWrite(VIN2, LOW);
  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, i);
    delay(10);
  }
  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, 0xff - i);
    delay(10);
  }
  //逆回転
  digitalWrite(VIN1, LOW);

  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, i);
    delay(10);
  }
  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, 0xff - i);
    delay(10);
  }
}
--------別のやりかた-------------------------------------------------------------

#define MOTOR_AIN1 0
#define MOTOR_AIN2 2

void setup() {
  pinMode(MOTOR_AIN1, OUTPUT);
  pinMode(MOTOR_AIN2, OUTPUT);
}

void loop() {
  digitalWrite(MOTOR_AIN1, LOW);
  analogWrite(MOTOR_AIN2,0);
  delay(1000);
  digitalWrite(MOTOR_AIN1, LOW);
  digitalWrite(MOTOR_AIN2, LOW);            
  delay(1000);
  analogWrite(MOTOR_AIN1, 0);
  digitalWrite(MOTOR_AIN2, LOW);
  delay(1000);
  digitalWrite(MOTOR_AIN1, HIGH);
  digitalWrite(MOTOR_AIN2, HIGH);
  delay(1000);
}



}ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

https://qiita.com/Google_Homer/items/b1508d94220e669c2c08

obnized M5StickC 回転Servoで2WD Car

0~90 前 91停止 91~180  後
https://kokensha.xyz/obniz/obniz-continuous-servo-test/

obnizで連続回転サーボを動かしてみる!

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


https://misoji-engineer.com/archives/motordriver-dc.html にくわしいがMICROPYTHON

スタンバイに3.3vを入力するのがポイント 5vでは暴走する!

https://tamanegi-digick.com/it/dcmtdrv/#toc30 がARDUINO-IDE

以下のようにanalogWriteは徐々にあげていかんと暴走する。。。。?

#define VIN1 1
#define VIN2 2
void setup() 
{
  pinMode(VIN1, OUTPUT);
  pinMode(VIN2, OUTPUT);
}

void loop()
{
  int i = 0;

  //正回転
  digitalWrite(VIN2, LOW);
  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, i);
    delay(10);
  }

  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN1, 0xff - i);
    delay(10);
  }

  //逆回転
  digitalWrite(VIN1, LOW);

  //回転速度を上げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, i);
    delay(10);
  }

  //回転速度を下げる
  for(i = 0; i < 256; i ++)
  {
    analogWrite(VIN2, 0xff - i);
    delay(10);
  }
}

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

https://qiita.com/Google_Homer/items/b1508d94220e669c2c08

obnized M5StickC 回転Servoで2WD Car

0~90 前 91停止 91~180  後
https://kokensha.xyz/obniz/obniz-continuous-servo-test/

obnizで連続回転サーボを動かしてみる!


2025年1月5日日曜日

obniz/microbit and 360 deg servo motor

 https://docs.obniz.com/ja/reference/obnizos-for-esp32/settings/setting-via-browser で

ブラウザからログインできた! 192.168.254.1でOKだった

回転サーボは施行錯誤したが0〜90で前進速度、91でストップ、92~180が後退だった

ちなみにmicrobitでは以下が詳しい

https://learn.switch-education.com/microbit-md-tutorial/15-rservo.html

2024年12月21日土曜日

PICとESP01でアクセスポイント(simple and complex)

 /*******************************************

 *  ESPをAPでサーバにする

 *    ESP_Server  :: LCDつないでないときは動きがバグるので全部コメントアウトした

*       電源いれたらスマホのwifiをAT_THINKER????につないでtcp/udp test toolを起動

 *******************************************/

#include "mcc_generated_files/mcc.h"

#include "i2c_lib2.h"

#include "lcd_lib2.h"

uint8_t StMsg[] = "Start Wi-Fi Test";

uint8_t Buffer[128], i, rcv;

/* WiFi設定用コマンドデータ */

const uint8_t Mode[] = "AT+CWMODE=2\r\n";

const uint8_t Mult[] = "AT+CIPMUX=1\r\n";

const uint8_t Serv[] = "AT+CIPSERVER=1,9000\r\n";

const uint8_t Send[] = "AT+CIPSEND=0,10\r\n";

const uint8_t Data[] = "AAAAAAAA\r\n";

/* 関数プロトタイプ */

void SendCmd(const uint8_t *cmd);

void Receive(uint8_t *buf);

/******* メイン関数 *****************/

void main(void)

{

    SYSTEM_Initialize();            // 初期化

    INTERRUPT_GlobalInterruptEnable();// 割込み許可

    INTERRUPT_PeripheralInterruptEnable();

    //lcd_init();                     // LCD初期化

    //lcd_clear();                    // LCD全消去

    //lcd_str(StMsg);                 // 初期メッセージ

     __delay_ms(5000);    // decomment above 3 lines add this line by me

    SendCmd(Mode);                  // ソフトAPモード

    SendCmd(Mult);                  // マルチ接続モード

    SendCmd(Serv);                  // サーバモード

    

    while (1)

    {

        if(EUSART_is_rx_ready() != 0){// 受信あり

            Receive(Buffer);       // \nまで受信

            //lcd_cmd(0x80);         // LCD1行目指定

            //for(i=0; i<32; i++){   // 32文字出力

            //    lcd_data(Buffer[i]);// 1文字表示出力

            //    if(i == 15)        // 16文字目か

            //        lcd_cmd(0xC0); // LCD2行目指定

            //}

            SendCmd(Send);         // 送信

            SendCmd(Buffer);        // 10文字(12345678+\r+\nをおくってみた)

        }

        //if(S1_GetValue() == 0){    // S1オンの場合

            SendCmd(Send);         // 送信

            SendCmd(Data);         // AAAAAの送信

        //}

         __delay_ms(5000); 

    }

}

/********************************

 * WiFiコマンド送信関数

 *  遅延挿入後戻る

 ********************************/

void SendCmd(const uint8_t *cmd){

    while(*cmd != 0)            // 0まで繰り返し

        EUSART_Write(*cmd++);   // 1バイト送信

    __delay_ms(1000);           // 1秒待ち

}

/***********************************

 *  WiFI受信関数 割り込み処理で受信

 ***********************************/

void Receive(uint8_t *buf){

    uint8_t rcv, cnt;


    cnt = 0;                    // カウンタリセット

    while(rcv != '\n'){         // \nまで繰り返し

        if(EUSART_is_rx_ready() != 0){// 受信あり

            rcv = EUSART_Read();// データ取り出し

            if((rcv != '\n')&&(rcv != '\r')){

                *buf = rcv;     // バッファに文字保存

                buf++;          // ポインタ更新

                cnt++;          // カウンタ更新

            }

        }

    }

    while(cnt < 32){        // 32文字まで

        *buf = 0x20;        // スペース追加

        cnt++;              // カウンタ更新

        buf++;              // ポインタ更新

    }       

}

--------------simple -------------------------------------------------------

/*******************************************

 *  ESPをアクセスポイントにする

 *    ESP_AP 簡単dhcp機能つき 端末は192.168.4.1固定

 *******************************************/

#include "mcc_generated_files/mcc.h"

/* WiFi設定用コマンドデータ */

const uint8_t Mode[] = "AT+CWMODE=2\r\n";

const uint8_t Mult[] = "AT+CIPMUX=1\r\n";

const uint8_t Serv[] = "AT+CIPSERVER=1\r\n";

/* 関数プロトタイプ */

void SendCmd(const uint8_t *cmd);

/******* メイン関数 *****************/

void main(void)

{

    SYSTEM_Initialize();

    __delay_ms(5000);

    __delay_ms(5000);

    SendCmd(Mode);  // APモード

    SendCmd(Mult);  // マルチ接続モード

    SendCmd(Serv);  // サーバモード

    while (1)

    {   }

}

/********************************

 * WiFiコマンド送信関数

 *  遅延挿入後戻る

 ********************************/

void SendCmd(const uint8_t *cmd){

    while(*cmd != 0)

        EUSART_Write(*cmd++);

    __delay_ms(1000);

}

https://analogicintelligence.blogspot.com/2019/09/wroom-02atweb-server.html 

これはさらにWebserverをつくっているが。。。。

2024年12月18日水曜日

ラズピコWでアクセスポイントなど

https://wisteriahill.sakura.ne.jp/CMS/WordPress/2023/05/01/pi-pico-w-build-web-server-application/ でSTAモードで成功

 https://takacity.blog.fc2.com/blog-entry-546.html でシンプルAP成功

https://note.com/nagisa_hoshimori/n/nd621ae39fc55 led on off server as AP

上記が一番参考になった!

https://xn--dx-eb4al8h6e.tech/2023/10/20/wifi%E3%81%A7raspberry-pi-pico-w%E3%82%92%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AB%E3%81%97%E3%81%A6%E6%8E%A5%E7%B6%9A%E3%81%97%E6%A9%9F%E5%99%A8%E3%82%92/onsitu 別解だが。。。

https://tanep.work/tanech/2024/02/25/post-256/ 非同期ライブラリ仕様。。。

以下のコードが完成品といえる 関数で切り分けておりわかりやすい

import usocket as socket

import network

import gc

# DEFINE

SSID:str = 'PICO_PICO_HAMMER'  # 任意のアクセスポイント名を指定可能

PASSWORD:str = 'qwertyuiop'  # 任意のパスワードを指定可能


def make_access_point(wifi_ssid:str, wifi_password:str):

    """アクセスポイントを作成し、access_pointを返す関数"""

    access_point = network.WLAN(network.AP_IF)  # AP:Access Pointとして使う

    access_point.config(essid=wifi_ssid, password=wifi_password)  # APの設定を反映する

    access_point.ifconfig(('192.168.4.1', '255.255.255.0', '192.168.4.1', '192.168.4.1'))  # 各種IPアドレスを指定する(固定)192.168.4.1

    access_point.active(True)  # アクセスポイントとして検知されるようになる

    # 接続が成功した場合、(IPアドレス、ネットマスク、ゲートウェイ、DNS)を表示

    print("Please connection access_point by other device...")

    print("IP Address:{}\nNet Mask:{}\nGateway:{}\nDNS:{}".format(*access_point.ifconfig()))

    return access_point


class MyHomepageServer():


    def __init__(self):

        # socketの構成、設定

        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

        self.socket.bind(('', 80))  # bind

        self.socket.listen(5)  # listen


    def _make_html_text(self, show_message:str):

        """ レスポンスとして返すテキスト(html形式)を返す関数 """

        html = ('''<html>

                     <head>

                       <meta charset="utf-8">

                       <title>Raspberry Pi pico server</title>

                     </head>

                     <body>

                       <h1>Message : {}</h1>

                       <a href="/led/on">Turn On LED</a></br>

                       <a href="/led/off">Turn Off LED</a>

                     </body>

                   </html>'''.format(show_message))

        return html


    def receive_waiting(self):

        """

        受信(accept)

        str型に変換し、テキストによって処理を分岐

        1. b'GET /led/on'の指示が記載されている

    -> LEDを点灯し、messageに「LED is ON!」を埋め込み、htmlを送信(send)

        2. b'GET /led/off\r\n'の指示が記載されている

    -> LEDを消灯し、messageに「LED is Off」を埋め込み、htmlを送信(send)

        3. b'GET /favicon.ico HTTP/1.1\r\n'の指示が記載されている 

   -> LEDを消灯し、messageに「GET favicon.ico」を埋め込み、htmlを送信(send)

        3. 上記(1,2,3)以外

    -> messageに「Please click any.」の文字列を埋め込み、htmlを送信(send)

   たまに'GET /favicon.ico HTTP/1.1\r\n'の指示がacceptされる。。。意味不明!

   多分3はいらん あるとled onしてもすぐ消える!

        """

        tmp_connection, addr = self.socket.accept()

  # 指示待ち状態に(指示あるまでココで一時停止状態となる)

        print(f'Got a connection from {addr}')  

 # アクセスして来た相手のAddressを表示

        received_text = tmp_connection.recv(1024)  

 # 受け取った内容を変数に格納(binary)

        print(f'=== Content ===\n{received_text}') 

  # 受け取った内容を表示(GET等)


        if b"GET /led/on" in received_text:

            led.value(1)  # 出力をHIGHにする(LEDが点灯)

            send_text = self._make_html_text("LED is ON!")

        elif b"GET /led/off" in received_text:

            led.value(0)  # 出力をlowにする(LEDが消灯)

            send_text = self._make_html_text("LED is Off")

        //elif b"GET /favicon.ico" in received_text:  ないほうがいいようだ

    // led.value(0)  # 出力をlowにする(LEDが消灯)

         // send_text = self._make_html_text("GET favicon.ico")

        else:

            send_text = self._make_html_text("Please click .")


        tmp_connection.send(send_text)  # 応答(response)を、接続相手に返す

        tmp_connection.close()  # connectionを閉じる

        return None

# ココからmain文

gc.collect()  # garbage collection(ゴミ掃除)

led = machine.Pin("LED", machine.Pin.OUT)  # LED点灯用のPINを設定

ap = make_access_point(SSID, PASSWORD)  # 関数にまとめてある


server = MyHomepageServer() # クラスを定義


while True:

    server.receive_waiting()  # こちらも関数にまとめてある


https://www.geekpage.jp/web/access-log/favicon.php によれば頼まんのにfavico.ico
をとりにいくブラウザがあるようだ