markdown esp32使用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown esp32使用方法相关的知识,希望对你有一定的参考价值。

# esp32にとは
arduino互換のマイコンでwifiとbluetoothを内蔵で1400円の開発キットが買える
今開発をするなら最もオススメできる

## 動作電源
+ 1.5Vの乾電池2本直列を3.3Vinに接続で動作確認済み
+ 充電池での動作確認を予定

## Arduinoとの違い
+ analogreadが3.3Vでarduinoと違い5Vでないので注意する

## ArduinoIDEで開発するまでの手順
1. arduinoIDEをダウンロードしたディレクトリ内の```hardware```ディレクトリに移動する
2. ```espressif```というディレクトリを作成
3. ```esp32```というディレクトリを作成
4. **https://github.com/espressif/arduino-esp32**からコードをダウンロードする
5. 解凍時の中身のみをesp32の中に移動する
**注意**上記の作業の結果```hardware/espressif/esp32```内にcoresやpackageなど様々なファイルが入っている状態にする。git cloneなどをして```espressif```内に```arduino-esp32```をそのまま入れないこと

上記の作業を終了するとArduinoIDEのツール内にあるボードから**ESP32 Dev Module**が選択できる

## Wifiサーバー接続テスト
```
#include <WiFi.h>

const char SSID[] = "********";
const char PASSWORD[] = "*****";

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  while (!Serial);

  WiFi.begin(SSID, PASSWORD);
  Serial.print("WiFi connecting");

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println(" connected");

  server.begin();

  Serial.print("HTTP Server: http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    client.println("Hello World!");
    client.stop();
  }
}
```
上記のプログラムを実行するとwifiに接続されブラウザで表示されたipに接続すると
Hello World!と表示される

## I2C通信

## I2C通信を利用したサーボ制御
I2Cを利用Adafruit 16-Channel 12-bit PWM/Servo Driverを使用する
これを使用することで複数のサーボを動かすことが可能になる

### Adafruit 16-Channel 12-bit PWM/Servo Driverの使用までにすること
**https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library**をarduinoIDEのディレクトリ内の```libraries```内にgit cloneする(zipからダウンロードして解凍でも問題ない)

### サンプルコード
参考 https://media.dmm-make.com/item/2495/
```
#include<Wire.h>
#include<Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm= Adafruit_PWMServoDriver();

#define SERVOMIN 150
#define SERVOMAX 600

void setup() {
  pwm.begin();
  pwm.setPWMFreq(50);
  servo_write(0,90);
  delay(3000);
}

void loop() {
  servo_write(0,90);
  servo_write(2,90);
  servo_write(4,90);
  delay(1000);
}

void servo_write(int n, int ang){
  ang = map(ang, 0, 180, SERVOMIN, SERVOMAX);
  pwm.setPWM(n, 0, ang);
}
```
### 上記のプログラムの注意
1. SERVOMINとSERVOMAXの値はそのサーボの最小最大のPWM周波数なので使用するサーボによって設定を変更する
2. pwm.setPWMFreqはサーボのPWM周期なので使用サーボによって設定を変更する
# esp32とPCのROSを接続する
+ rosのノードとしてesp32を使用しpubsubの通信などができる
+ 有線、無線のどちらも使用可能
+ 準備はrosserialをインストールするだけ

## rosserialを使用するまで
1. PC側の準備 : 下記のパッケージをダウンロード
```
sudo apt-get install ros-kinetic-rosserial-arduino
sudo apt-get install ros-kinetic-rosserial
```
kineticの部分は自分のPCに入っていいるrosのパッケージに合わせる

2. ArduinoIDEをインストールしたディレクトリ内の ```libraries``` ディレクトリに移動する
3. ```rosrun rosserial_arduino make_libraries.py .``` を実行する  
**注意** 上記のコマンド実行前にlibrariesにros_libディレクトリがあった場合削除する
4. 上記の作業を終了後、ArduinoIDEのサンプルスケッチの中にros_libが入っていた場合作業終了となりrosserialが利用できる

## rosserialのサンプルコード
1. hello_world!を配信する

```
#include <ros.h>
#include <std_msgs/String.h>

ros::NodeHandle  nh;

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  nh.initNode();
  nh.advertise(chatter);
}

void loop()
{
  str_msg.data = hello;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(1000);
}
```

2. sensor_msgsのJointStateを購読して配信する

```
#include <ros.h>
#include <sensor_msgs/JointState.h>
#include <std_msgs/Float64.h>

ros::NodeHandle nh;

std_msgs::Float64 angle_msg;
ros::Publisher chatter("chatter",&angle_msg);

void messageCb( const sensor_msgs::JointState& msg){
  angle_msg.data = msg.position[0]*180/3.14;
}

ros::Subscriber<sensor_msgs::JointState> sub("joint_states", messageCb );

void setup()
{ 
  nh.initNode();
  nh.advertise(chatter);
  nh.subscribe(sub);
}

void loop()
{  
  chatter.publish(&angle_msg);
  nh.spinOnce();
  delay(100);
}
```

3. wifiを利用してhello_world!を配信する

```
#include <ros.h>
#include <std_msgs/String.h>
#include <WiFi.h>

const char SSID[] = "******";
const char PASSWORD[] = "*******";
IPAddress server(192,168,0,1);
const uint16_t serverPort = 11411;

WiFiClient client;

class WiFiHardware {

  public:
  WiFiHardware() {};

  void init() {
    // do your initialization here. this probably includes TCP server/client setup
    client.connect(server, serverPort);
  }

  // read a byte from the serial port. -1 = failure
  int read() {
    // implement this method so that it reads a byte from the TCP connection and returns it
    //  you may return -1 is there is an error; for example if the TCP connection is not open
    return client.read();         //will return -1 when it will works
  }

  // write data to the connection to ROS
  void write(uint8_t* data, int length) {
    // implement this so that it takes the arguments and writes or prints them to the TCP connection
    for(int i=0; i<length; i++)
      client.write(data[i]);
  }

  // returns milliseconds since start of program
  unsigned long time() {
     return millis(); // easy; did this one for you
  }
};


ros::NodeHandle_<WiFiHardware> nh;

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  Serial.begin(115200);
  WiFi.begin(SSID,PASSWORD);
    Serial.print("WiFi connecting");

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println(" connected");
  nh.initNode();
  nh.advertise(chatter);
  delay(10);
}

void loop()
{
  str_msg.data = hello;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(1000);
}
```

**注意**  
IPAddress serverの部分はホストとなるPCのIPアドレスをifconfigなどで調べて入力する  
serverportはデフォルトでは11411になっているので基本的に変更の必要はない

## esp32(arduino)と通信をするノードの起動
esp32と通信をするには有線でもwifiでもその通信のためのノードを起動する必要がある  
そのため、esp32にコードを書き込んだら、PC側で通信用のノードを起動するのを忘れないこと
+ 有線の場合
```
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
```
**_port:=**の後ろは自分の使用しているesp32が挿入されているポートであるため自分の状態によって変更する    
ArduinoIDEで選択したところと同じで問題ない  
**注意**  
上記の作業で接続の許可がないと言われたら ```chmod 777 /dev/ttyUSB0```というように権限を与える  
有線でArduino側のシリアルモニタを起動するとエラーになるので注意

+ 無線の場合
```
rosrun rosserial_python serial_node.py tcp
```
**注意**  
無線の場合は逆にSerial.beginを指定しないと接続できなかったため注意する

以上是关于markdown esp32使用方法的主要内容,如果未能解决你的问题,请参考以下文章

markdown 删除ESP8266

ESP32C3 LED PWM使用和ESP32差异说明

ESP32/ESP8266自动下载电路波形,ESP32/ESP8266不能UART流控自动下载的解决方法

ESP32/ESP8266自动下载电路波形,ESP32/ESP8266不能UART流控自动下载的解决方法

ESP32/ESP8266自动下载电路波形,ESP32/ESP8266不能UART流控自动下载的解决方法

esp32蓝牙频偏