0

链接到 arduino 的设置我是 Arduino 之类的初学者。我试图在 2 个 Arduino 之间建立一个 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,如果按下“传感器”(FSR),则不会有任何动作……我在串行中得到 FSR 值,但在主设备的串行中没有。 ..我不知道我到底做错了什么。拜托,你们能看穿我的意大利面条代码并告诉我我的错吗?

4

1 回答 1

0

您的代码存在一些问题。可能与 FSR 模拟输入有关。

将 FSR 的一端连接到 5V,另一端连接到模拟 0。然后将模拟 0 的 10K 电阻的一端连接到地。

这样,您将在模拟输入上获得 0 伏(无压力)和 4.9 伏(全压~22lb)之间的电压。

这将产生一个介于 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);
            }
        }
}
于 2017-09-12T19:37:20.113 回答