mBlock & Arduino(13)使用摇杆控制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mBlock & Arduino(13)使用摇杆控制相关的知识,希望对你有一定的参考价值。

参考技术A 摇杆这东西,经常可见到它的应用,电玩设备就不用说了,我前阵子刚挂掉的行车记录器,上头也有个小摇杆,主要用来上下左右操控选单,以及按下摇杆确认选项 … XD

不同厂商制作的类比摇杆,脚位与标示上可能会有所不同,不过基本上会有五个脚位,分别为电源、GND、X 轴、Y 轴、开关,以我手中的 Keyes_Sjoys 来说:

从左至右的接脚顺序与标示分别是 GND、+5V、VRx、VRy、SW,SW 就是开关输出的意思,在接好 +5V 与 GND,而摇杆不按下的情况下,Keyes_Sjoys 的 SW 会有电压输出,按下摇杆的话,SW 会是 0V。

至于 VRx 与 VRy 输出,是以类别电压输出来表示目前摇杆的方向状态,在未操作摇杆的情况下,VRx 与 VRy 大致是在 2.5V,如果在 X 方向移动,VRx 会有 0 到 5V 变化,如果在 Y 方向移动,VRy 也是有 0 到 5V 变化。

因此,可以将 VRx 与 VRy 接到 Arduino 的类别脚位,依摇杆操作的方向,我实际量得 Arduino 的类比输入值变化为:

在 Fritzing 中有个通用的摇杆元件,接脚顺序与标示则分别是 VCC、VERT、HORZ、SEL、GND,SEL 就是选择,其实也就是开关的意思:

因此,如果要使用摇杆控制猫咪,可以如下衔接电路,VCC、VERT、HORZ、SEL、GND,SEL 等脚位,就对应至你实际使用的摇杆模组脚位即可:

我要使用摇杆来控制猫咪的上、下、左、右移动,而按下摇杆,猫咪会发出“喵”一声,为了符合操作习惯,以向右为 X 正方向,而向上为 Y 正方向,因此,我用 488 减去 Arduino 从 Keyes_Sjoys 的 VRy 量得的值:

你也可以挑战使用摇杆来控制 3D 立方体旋转喔!

这是自己用“画笔”绘制的,一点点电脑图学的应用,最主要的是,知道 x-y-z 三维座标中某个点,如何绕轴旋转,这部份可参考〈 三维直角座标之绕轴旋转 〉。

然后,正立方体以 (0, 0, 0) 为中心,订出八个顶点,这部份可参考〈 顶点索引阵列 〉,只要看第一张图就可以了,我没有用顶点索引阵列,因为在 Scratch(mBlock) 中没办法,因为它的程式元素太少,难以实作顶点索引阵列,因此,我简化了绘图,用最简单(但重复)的方法,直接跑一维清单而已 … 就只是程式码重复了四次,理论上是要跑六个面,不过,跑四个面,每个边就都至少画过一次了 … XD

有兴趣研究一下电脑图学的,可以参考一下我的〈 电脑图学入门 〉文件。

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

如何使 AT 命令在 arduino 中为 ESP8266 wifi 模块以编程方式工作

【中文标题】如何使 AT 命令在 arduino 中为 ESP8266 wifi 模块以编程方式工作【英文标题】:How to make AT commands work programatically in arduino for ESP8266 wifi module 【发布时间】:2015-02-24 09:08:26 【问题描述】:

我正在使用 arduino uno 上的 ESP8266 wifi 模块进行从 arduino 到 raspberry-pi 的简单 tcp 通信。tcp 服务器在 raspberry-pi 上运行。我可以使用以下 AT 命令进行 TCP 通信在 arduino 串行监视器中,波特率为 9600。

AT+CIPMUX=1
AT+CIPSTART=4,"TCP","192.168.43.150",7777
AT+CIPSEND=4,5
>hai

如何在 arduino 草图中以编程方式执行此操作。我在我的 arduino uno 上使用了以下代码,但仍然没有成功。波特率仅为 9600,因为它直接在串行监视器中工作。

#include <SoftwareSerial.h>
SoftwareSerial esp8266(2,3);

void setup()

  Serial.begin(9600);
  esp8266.begin(9600); // your esp's baud rate might be different


void loop()

 esp8266.println("AT");
 if(esp8266.available()) // check if the esp is sending a message 
 
 while(esp8266.available())
  
    // The esp has data so display its output to the serial window 
    char c = esp8266.read(); // read the next character.
    Serial.write(c);
    
 

连接如下

  ESP8266  Arduino Uno

  Vcc       3.3V
  CH_PD     3.3V
  RX        RX(PIN 2) 
  TX        TX(PIN 3)
  GND       GND 

【问题讨论】:

【参考方案1】:

这可能有点晚了,但我最近遇到了类似的问题。如果它已排序,请随意忽略它。

根据您的 ESP8266 模块的固件版本,9600 的波特率可能无法正常工作,请尝试 115200 - 它可能会更可靠?

我认为您上面的代码不起作用的主要原因是 ESP 在 AT 命令末尾需要换行符和回车符。串行监视器会为您添加这些。而不是发送AT 尝试发送AT\r\n。这应该会鼓励 ESP 回复OK,或者如果打开了回显AT\r\nOK

Serial.available() 还检查接收缓冲区中是否有内容 - 不幸的是,这需要时间,所以我不得不在其中放置一个 delay(10) 以使其在缓冲区中注册一个字符。

#include <SoftwareSerial.h>

//i find that putting them here makes it easier to 
//edit it when trying out new things

#define RX_PIN 2
#define TX_PIN 3
#define ESP_BRATE 115200

SoftwareSerial esp8266(RX_PIN, TX_PIN);

void setup()

  Serial.begin(9600);
  esp8266.begin(ESP_BRATE); // I changed this


void loop()

 esp8266.println("AT\r\n"); //the newline and CR added
 delay(10);  //arbitrary value

 if(esp8266.available()) // check if the esp is sending a message 
 
 while(esp8266.available())
  
    // The esp has data so display its output to the serial window 
    char c = esp8266.read(); // read the next character.
    Serial.write(c);
    
 

我的下一个问题是我的 ESP 的 0 回复不可靠 - 有时它们被读取为 OK,但有时它们是垃圾值。我怀疑是模块功率不足的问题。

【讨论】:

我遇到了同样的问题,有时它会返回垃圾值。我解决了它,增加了延迟句子的时间。对我来说,100 就可以了。所以,不要使用 'delay(10);'我写了 'delay(100)' 让它适用于所有没有垃圾的命令。【参考方案2】:

我遇到了同样的问题,但还没有找到解决方案。 但是您的连接有点麻烦,您必须将 ESP8266 模块的 TX 引脚连接到 arduino 的 RX 引脚,将 E​​SP8266 模块的 RX 引脚连接到 TX 引脚。 希望这对您有所帮助

【讨论】:

以上是关于mBlock & Arduino(13)使用摇杆控制的主要内容,如果未能解决你的问题,请参考以下文章

arduino编译报错问题

Arduino-位操作

无法使用 qtserial 将数据写入 Arduino

调用其他函数后,Arduino函数保持循环

第一次发文 此为简单介绍

ht1621之arduino及stm8驱动