Link to set up of arduino's我是像Arduino这样的初学者。我试图在2个Arduinos之间建立一个BLE HM10连接。我将BLE模块连接到我的FTDI电缆并将它们设置为主设备和从设备。当我加电时,它们会立即连接。我将波特率设置为9600(默认值)并尝试发送"传感器值"从从机到主板,伺服应该移动。
我编写了我的代码,并以多种方式对其进行了测试。 Arduino引脚0/1和7/8中的HM10 Rx / Tx引脚......对我来说没什么用。我写了一个声明,如果从属设备的数据到达主设备,则串行终端不输出任何内容而不是" A"。
我使用Arduino Uno作为奴隶使用此代码:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); // RX, TX
// Connect HM10 Arduino Uno
// TXD Pin 7
// RXD Pin 8
int reading = A0; // FSR attached to A0
int fsrreading;
int val;
void setup() {
Serial.begin(9600);
mySerial.begin(9600); //bluetooth serial begin
}
void loop() {
int reading = analogRead(A0); //read fsr value
Serial.print("Analog reading = ");
Serial.println(reading);
int val = map(reading, 0, 1023, 0, 180); // convert to servo value
Serial.print("servo value = ");
Serial.println(val);
mySerial.write(val);//send fsr value to bt serial to the master
delay(500); //Tweak this to lower value if communication is working
}
这是Arduino Leonardo的主人代码:
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial mySerial(7, 8); // RX, TX
// Connect HM10 Arduino Uno
// TXD Pin 7
// RXD Pin 8
int servoPin = 9; //attached to pin 9 (PWM)
Servo myservo;
int val;
int data;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);//bluetooth serial begin
myservo.attach(servoPin);//servo obj is attached to pin9
}
void loop()
{
int avail = mySerial.available();//check is serial is available
if (avail > 0)
{
for (int i = 0; i < avail; i++)
{
int data = mySerial.read();
//no need to map or constrain
// data is already between 0 an 180
myservo.write(data);//move servo to pos
Serial.println(data,DEC);
delay(50);
}
}
}
如果我打开串口终端,我就得到A,如果我按下传感器&#34;那么就不要采取任何行动。 (FSR)......我在序列中获得了FSR值,但没有在主人的序列中获得...我不知道我到底做错了什么。 伙计们,你能看透我的意大利面条代码并告诉我我的错吗?
答案 0 :(得分:0)
您的代码存在一些问题,可能还有FSR模拟输入。
将FSR的一端连接到5V,另一端连接到模拟0。 然后将10K电阻的一端从模拟0连接到地。
这样,您将在模拟输入上获得0伏(无压力)和4.9伏(全压力~22磅)之间的电压。
这将导致模拟值介于0和1023之间。
mySerial.write(val)以字节形式发送整数,但高于255的int值不适合字节,因此垃圾发送。 在发送之前映射您的模拟值。 如果将其映射到伺服的值,则接收器不需要转换。 这样:
int reading = analogRead(A0); //read fsr value
Serial.print("Analog reading = ");
Serial.println(reading);
int val = map(reading, 0, 1023, 0, 180); // convert to servo value
Serial.print("servo value = ");
Serial.println(val);
mySerial.write(val);//send fsr value to bt serial to the master
delay(500); //Tweak this to lower value if communication is working
这一行:
int val = mySerial.println(fsrreading); //convert fsr value in clean int
没有做你认为它正在做的事情。它可能返回fsrreading长度,但可能不需要垃圾,所以删除它。
在我的示例行中,我将延迟设置为500. HM10的缓冲区可以处理20个字节, 所以尽量将延迟设置得尽可能低而不会使缓冲区溢出。
在接收代码中,您只读取一个字节。 要获得平滑的伺服运动,您必须读取所有可用的并处理所有字节以设置伺服。 当您阅读所有可用的内容时,无需清理Serial 阅读或清洁后检查可用,将始终在草图中打印A.
而是检查收到的数据并打印出来,以便您知道收到的内容。 代码:
void loop()
{
int avail = mySerial.available();//check is serial is available
if (avail > 0)
{
for (int i = 0; i < avail; i++)
{
int data = mySerial.read();
//no need to map or constrain
// data is already between 0 an 180
myservo.write(data);//move servo to pos
Serial.println(data,DEC);
delay(50);
}
}
}