esp32の使い方についてまとめる
arduino互換のマイコンでwifiとbluetoothを内蔵で1400円の開発キットが買える 今開発をするなら最もオススメできる
hardware
ディレクトリに移動するespressif
というディレクトリを作成esp32
というディレクトリを作成hardware/espressif/esp32
内にcoresやpackageなど様々なファイルが入っている状態にする。git cloneなどをしてespressif
内にarduino-esp32
をそのまま入れないこと上記の作業を終了するとArduinoIDEのツール内にあるボードからESP32 Dev Moduleが選択できる
#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を利用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);
}
sudo apt-get install ros-kinetic-rosserial-arduino
sudo apt-get install ros-kinetic-rosserial
kineticの部分は自分のPCに入っていいるrosのパッケージに合わせる
libraries
ディレクトリに移動するrosrun rosserial_arduino make_libraries.py .
を実行する#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);
}
#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);
}
#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と通信をするには有線でも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を指定しないと接続できなかったため注意する