回顾MIPT上的Arduino /机器人技术在线课程(第二周)


此处开始,我们将继续发布在线课程“构建机器人和其他Arduino设备”的概述。


因此,很短的时间, MIPT在线机器人课程的第二周结束了。 坦白说,这一周充满了各种各样的话题。


这是我为自己分配的示例列表:


  • 分压器。 使用光敏电阻和热敏电阻
  • 模拟信号。 信号宽度
  • 通过串口通讯。 加工环境
  • 数字信号。 按钮和连接选项。 上拉电阻
  • 逻辑表达式,if和else语句
  • 蜂鸣器,LED条,七段指示灯
  • 微电路。 逻辑反相器74HC04,移位寄存器74HC595
  • 调试程序
  • 外部模块
  • 现成的监视系统的一种变体,可以在LED刻度上显示温度和光照水平,以及在超过一定温度时可以工作的扬声器

成功通过测试并从课程中收集了拟议的方案后,我考虑了如何改进该方案或该方案或收集我自己的东西。



首先想到的是光传感器的现代化。 本课中提出的实现方法只是简单地从光敏电阻取值并将其发送到串行端口。


升级后的版本应使用七段指示器来显示从0(最小照明)到9(最大照明)的数字。 指示器必须通过移位寄存器连接。 必须使用两个按钮来设置最小和最大照明水平。 为了不在每个段上使用Arduino引脚,而是使用更少的引脚,需要移位寄存器。 实际上,移位寄存器将串行数据输出(每单位时间一位)转换为并行(每单位时间几位)。 在我们的案例中,我们只需要三个,而不是七个Arduino引脚。


在Fritzing编辑器中,我得到了这样的设备。



这样看起来很生动。




采取了与移位寄存器和光敏电阻一起工作的方案的基础。


请注意,板上的光敏电阻的连接方式与视频教程中的连接有所不同-我们在光敏电阻上获得相对于地面的电压值,在电路中,我们消除了相对于电源的电压降。 这样做是为了稍微简化程序-随着照明水平的增加,光敏电阻的电阻减小。 因此,在相同电流下,电压降减小。 因此,在模拟输入端,电压越高,照明水平越高,反之亦然。


现在由您来确定源代码。 相同的程序被用作在七段指示器上显示该值的基础。


程式码
// ,      #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 //  ,        #define BTN_MIN 3 #define BTN_MAX 2 // ,       #define SENS_PIN A5 //     ,   byte d0 = 0b01111101; byte d1 = 0b00100100; byte d2 = 0b01111010; byte d3 = 0b01110110; byte d4 = 0b00100111; byte d5 = 0b01010111; byte d6 = 0b01011111; byte d7 = 0b01100100; byte d8 = 0b01111111; byte d9 = 0b01110111; //        int min_light = 0; int max_light = 1023; //    int value; // ,  .  .  int output; //   int digit; void setup() { //     pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); //       Serial.begin(9600); //     pinMode(BTN_MIN, INPUT_PULLUP); pinMode(BTN_MAX, INPUT_PULLUP); } void loop() { //     value = analogRead(SENS_PIN); output = value; //    -    if (!digitalRead(BTN_MIN)) min_light = value; if (!digitalRead(BTN_MAX)) max_light = value - 10; //      if (value < min_light) output = min_light; if (value > max_light) output = max_light; //  ,      digit = map(value, min_light, max_light, 0, 9); //   Serial.println("Value: " + String(value) + " Output: " + String(output) + " Min: " + String(min_light) + " Max: " + String(max_light) + " Current : " + String(value) + " Digit: " + String(digit)); //      if (digit == 0) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d0); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 1) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d1); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 2) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d2); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 3) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d3); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 4) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d4); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 5) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d5); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 6) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d6); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 7) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d7); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 8) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d8); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 9) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d9); digitalWrite(LATCH_PIN, HIGH); } //       delay(10); } 

其中的功能-设置最大照明度时,我们必须减去一些根据经验选择的常数(max_light = value-10)。 由于从光敏电阻获取的电压值不稳定,因此有必要避免在最大照明水平下“晃动”。


我们编译草图,将其加载到Arduino中并进行检查。


首先在端口监视器中...




然后住



如您所见,该设备按照说明成功工作。 当然,仍有改进的空间-例如,当照明低于特定水平时,您可以添加音频信号-这意味着您需要在工作场所打开其他照明。 同样,将来也可以使用数组和其他功能来更改程序本身。


最后,我再次重申,本周在各个主题上活动非常多。 请注意,自从课程在Arduino IDE中发布以来,内置的Serial Plotter功能就出现了,该功能与课程中考虑的处理环境功能部分重叠。 同样,在本周结束时,当最终设备由现成的元件组装时,作者想到了模块化的想法-例如,模块,带有内置上拉电阻的按钮,现成的光传感器,其中光敏电阻和常规电阻已经组装到分压器中,等等。 但是,该设备可以很容易地组装在试验板上。 问题是针对读者的,您是否曾经为自己的设备辩护? 您为此使用了什么材料? 也许纸板,胶合板,有机玻璃,或者今天流行的3D打印机?

Source: https://habr.com/ru/post/zh-CN403029/


All Articles