博主也是新手,由于网上资料较少 花了整整快一个月的时间才将所有的逻辑打通 弄清楚
博主所接的项目是使用小机器人与wifi模块去建立RadioMap. 在这里博主不多解释RadioMap 是什么,有好奇的宝宝可以自行谷歌或者百度。 这里只需要知道建立RadioMap需要收集附近WiFi的RSSI以及SSID.
博主这里所选的小机器人是Makeblock 所开发的mBot以及所对应的WiFi 模块, 在仔细查询资料后才知道mBot所用的开发板是Arduino UNO,WiFI模块是以ESP8266为基础开发的模块。由于其积木编程过于局限,所以选择了Arduino IDE。
我们需要配置Arduino IDE 分成两步:导入makeBlock library 以及配置ESP8266的开发环境
配置Arduino IDE 的教程在这里:
https://jingyan.baidu.com/article/8065f87f904f4c2331249881.html(导入Arduino 的外包-makeBlock library)
https://www.cnblogs.com/kekeoutlook/p/8216639.html(配置ESP8266开发环境)
整个ESP8266 的模块与Arduino的逻辑是这样的:ESP8266 是一个单片机, Arduino UNO 是一个单片机,我们需要解决的是ESP8266 与Arduino的通信以及传输问题。 整个步骤如下:
1. 编写ESP8266的代码 并进行烧录
2. 编写Arduino的代码并进行烧录
3. 编写Java 代码 与ESP8266 进行通信
第一步:
首先说一下ESP8266 的烧录方式, 你需要买一个USB 转TTL的转换器来连接ESP8266 模块与计算机, 楼主这里选择的是型号为USB转UART串口模块CP2102 usb TTL485互转模块,淘宝上一搜都有,当然你可以选择别的 下面这个是图片。在使用时需要把开关打开。 具体的连线方式你们自己去搜就好 网上有很多。 接下来把代码代码复制到Arduino中 进行烧录 Arduion 也给了许多样例,照着改就好 下面是博主的代码:
#include
const char* ssid = "ESP8266 需要连接的WIFI的SSID";
const char* password = "Wifi密码";
void setup() {
Serial.begin(9600);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
int whetherConnect = 0;
WiFiClient client;
const uint16_t port = 8082;
const char * host = "你的IP"; // ip or dns
void loop() {
if(client.connected()==true)
whetherConnect=1;
else
whetherConnect=0;
if(whetherConnect==0)
{
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, port)) {
Serial.println("connection failed");
Serial.println("wait 5 sec...");
delay(5000);
return;
}
else
{
whetherConnect =1;
}
}
if(Serial.available())
{
if(Serial.read()=='#')
{
int n = WiFi.scanNetworks();
Serial.println("scan done");
if(n==0)
{
client.println("no networks found");
delay(200);
}
else
{
client.print(n);
client.println(" networks found");
delay(500);
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
//client.print(i + 1);
//client.print(": ");
client.print(WiFi.SSID(i));
delay(500);
client.print(" ");
delay(500);
client.println(WiFi.RSSI(i));
delay(500);
// client.print(")");
//client.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
}
}
// This will send the request to the server
client.println("------------------------------------------");
//read back one line from server
//String line = client.readStringUntil('\r');
//Serial.println(line);
//Serial.println("closing connection");
//client.stop();
// Serial.println("wait 5 sec...");
// delay(5000);
}
}
}
在烧录成功后 即可拔下(如果出现不成功的情况别慌 把串口拔下来 在插回电脑就行 多插两次 即可)
2. 将代码烧录进Arduino UNO:
这里相信大家都知道便不再多说 直接上代码:
#include
#include
#include
#include
MeUltrasonicSensor ultrasonic_3(3);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
double currentTime = 0;
double lastTime = 0;
double getLastTime(){
return currentTime = millis() / 1000.0 - lastTime;
}
void move(int direction, int speed) {
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1) {
leftSpeed = speed;
rightSpeed = speed;
} else if(direction == 2) {
leftSpeed = -speed;
rightSpeed = -speed;
} else if(direction == 3) {
leftSpeed = -speed;
rightSpeed = speed;
} else if(direction == 4) {
leftSpeed = speed;
rightSpeed = -speed;
}
motor_9.run((9) == M1 ? -(leftSpeed) : (leftSpeed));
motor_10.run((10) == M1 ? -(rightSpeed) : (rightSpeed));
}
MeBuzzer buzzer;
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
int RxPin[]={12,10,A3,A1};
int TxPin[]={11,9,A2,A0};
SoftwareSerial mySerial(RxPin[4-1],TxPin[4-1]);
void _delay(float seconds) {
long endTime = millis() + seconds * 1000;
while(millis() < endTime) _loop();
}
void setup() {
mySerial.begin(9600);
Serial.begin(9600);
delay(5000);
}
void _loop() {
}
int sendOrNot=0;
void loop() {
if(ultrasonic_3.distanceCm() < 50){
motor_9.run(0);
motor_10.run(0);//Stop Running
if(sendOrNot==0)
{
buzzer.tone(262, 0.25 * 1000);
delay(20);
mySerial.println("#");
sendOrNot=1;
}
if(getLastTime() > 15){//If timer bigger than 5
move(3, 50 / 100.0 * 255);
_delay(1);
move(3, 0);
}
}else{
sendOrNot=0;
lastTime = millis() / 1000.0;
move(1, 50 / 100.0 * 255);
}
_loop();
}
你们这的代码肯定不能跟我一样 因为我使用的是mBot 的主板 其中有一些变化 如果用的是Arduino UNO的话 可以自己去看Arduino IDE 给的样例。当然串口那你们需要自己去写, 这块的内容 百度即可 会有很多
3. 编写Java程序:
博主这里使用的是Java Socket 通信 具体过程便不再阐述 上代码:
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerCode{ private static final int SERVER_PORT = 8082; private static File writeName = new File("Radiomap.txt"); public static void main(String args[]) { try{ writeName.createNewFile(); FileWriter writer = new FileWriter(writeName); BufferedWriter out = new BufferedWriter(writer); System.out.println("Server: Connecting..1111111"); ServerSocket serverSocket = new ServerSocket(SERVER_PORT); InputStream socketInput; Socket clientSocket = serverSocket.accept(); System.out.println("Server:Receiving..."); while(true){ try { socketInput=clientSocket.getInputStream(); BufferedReader in = new BufferedReader( new InputStreamReader(socketInput) ); String str = in.readLine(); //System.out.println("11111111"); System.out.println("Server:Received: '"+str+"'"); out.write(str+"\n"); out.flush(); }catch(Exception e){ System.out.println("Server:Error"); e.printStackTrace(); } /* finally { clientSocket.close(); System.out.println("Server:Close."); }*/ } } catch (IOException e) { e.printStackTrace(); } } } 接下来将Arduino 与ESP8266 连接后 就可以开始用啦! 在启动小车与java程序后 你会发现 每到一个有障碍物的地方 小车就会停下 收集RSSI与SSID进行传输 在Java端便可以看到了 博主的项目有特殊性 仅供参考哦! 如果有什么不对的地方 请指出。 不喜勿喷!