给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II

2020-10-311.1万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用Firebeetle Board-M0、8” 320x240 IPS TFT电阻触摸显示屏和Gravity:URM09-模拟量超声波测距传感器,制作一个迷你APPLE II-惊喜机。该项目适用于STEM教育场景,适合儿童科学实验。通过硬件连接、处理图片、下载GDL库文件、编写代码以及设计外壳等步骤,最终实现当有人靠近时,屏幕会显示不同表情图片的效果。
一直以来我都是一个不经吓的人,我很清楚但也都坦然接受了(主动锻炼一下胆量?不存在的不存在的),直到有一天在办公室,我正专心盯着屏幕工作着,一个同事突然站在我旁边讲话,把我吓得弹跳一下,差点原地升天,我就知道是时候做点什么努力了。于是,接下来两天我很慎重的思考了一下去鬼屋的可行性,结果当然是打死不去了!那该怎么办呢,后来我灵机一动,或许可以给自己设计一个小装置用来提醒我有人正在接近,而我也需要它能不动声色的提醒我却不被来人发现,或许如果有人真的想在万圣节这样的节日给我一个“惊喜”,那么就不要怪我皮一下啦,我可以给他介绍一下我的新玩具,引导它近距离观察装置,当距离小到一定范围内时,我的装置也可以”惊

对了,或许有朋友知道1977年推出的Apple II个人电脑吗,虽然和后来大名鼎鼎的有“白雪公主设计语言”的Apple IIC比起来它似乎存在感不那么强,但它的推出确实掀起了个人电脑革命, Apple II的设计和当时别的电脑的设计非常不同,它看起来更像家用电器,拆箱即可使用,因此无论是办公还是家用都很合适。我第一次在设计史的课堂上见到它就印象深刻,像这样的具有传奇色彩的产品,一直以来都在我的梦想产品清单里。正好这次要DIY”惊喜“机,于是结合我手里有的一些器件我决定给自己设计一个迷你APPLE II-”惊喜“机,算是了了两个心愿,快乐值加倍!朋友们也可以动手做起来哦,简单有用还有趣,文末可以感受到我安利的诚意。那接下来简要介绍一下这次的小应用思路,如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图16
好的,那么开始之前先看一下成品图!
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图22



一、硬件准备

1 Firebeetle Board-M0(V1.0) 1
2 8” 320x240 IPS TFT 电阻触摸显示屏 1
3 Gravity:URM09-模拟量超声波测距传感器 1
4 四脚按键开关 1
5 220欧电阻 1
6 杜邦线 若干
7 Gravity 3P线 1
8 GDI连接线 长度最好选择20cm或30cm的 1
9 type-c线 1
序号名称 数量


如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图10
二、软件准备
序号 名称
1 Arduino IDE
2 Img2Lcd(将图片转换为代码信息)

三、具体操作
1.硬件连接(如图)  
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图18
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图14

  将排针焊在M0上,这里需要用到一个模拟引脚一个数字引脚(我这里数字引脚是3,和按钮连接在一起;模拟引脚是A3,和测距传感器连接在一起)(垃圾焊接技术轻喷,我会继续好好练习的,如果你有什么焊接小技巧,欢迎评论区留言)。如图为我的M0焊接情况:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图13
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图8
    如图为我的按钮焊接情况:其中,在焊接接地杜邦线前焊接了一个220欧电阻。
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图17
2. 处理图片
    如图为我下载的一个表情图片以及一张万圣节图片,于是我得到了7张新图(将图片全部裁剪成4:3后旋转90°)命名为1-7。如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图4
打开软件Img2Lcd,百度一下即可下载。导入图片,如图设置(此处我将图片设定为60*80)后,得到7个c类文件。如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图5
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图6
3.下载GDL库文件(屏幕的库文件)

    链接如下。
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图3
   下载解压后将库加载到Arduino的库中。
4.梳理代码
    依据前文提到的设计思路,只需要在合适的距离s时调用正确对应的图片显示即可。整理代码如下(复制即可使用):
    1)将图片信息复制到代码开始的位置,如图表示即可(由于图片信息代码量太大,此处示意):
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图7
      2)主体代码
  1. #include "SPI.h"
  2. #include <DFRobot_GDL.h>
  3. #include "DFRobot_GDL.h"
  4. #define screen_CS         5
  5. #define screen_DC         7
  6. #define screen_LED        0
  7. #define screen_RST        6
  8. //DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  9. //DFRobot_ST7789_240x320_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  10. //DFRobot_ILI9341_240x320_HW_SPI  screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  11. //DFRobot_ILI9488_320x480_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  12. /* M0 mainboard DMA transfer */
  13. //DFRobot_ST7789_240x240_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  14. //DFRobot_ST7789_240x320_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  15. DFRobot_ILI9341_240x320_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  16. //DFRobot_ILI9488_320x480_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
  17. long time3;      
  18. int sensorPin=A3;
  19. int buttonPin=3;
  20. int sensorValue=0;
  21. int buttonState;
  22. int lastButtonState = LOW;
  23. int n=0;
  24. const unsigned char *c[7]={
  25. gImage_1,
  26. gImage_2,
  27. gImage_3,
  28. gImage_4,
  29. gImage_5,
  30. gImage_6,
  31. gImage_7
  32. };
  33. void setup() {
  34.   // put your setup code here, to run once:
  35.   pinMode(buttonPin,INPUT);
  36.   Serial.begin(9600);
  37.   screen.begin();
  38.   time3 = millis();
  39.   Serial.println(millis()-time3);
  40. }
  41. void loop() {
  42.   // put your main code here, to run repeatedly:
  43.   sensorValue = analogRead(sensorPin);
  44.   Serial.println(sensorValue);
  45.   int reading = digitalRead(buttonPin);
  46.   if(sensorValue>300){
  47.     if(n>0){
  48.       for(int i=n;i>0;i--){
  49.           screen.zoomPicture((void*)c<i>,2);
  50.           delay(100);
  51.       }
  52.      }
  53.      else{
  54.       screen.zoomPicture((void*)c[n],2);
  55.       delay(100);
  56.      }
  57.      n=0;
  58.   }
  59.   else if(sensorValue>250){
  60.     if(n>1){
  61.       for(int i=n;i>1;i--){
  62.           screen.zoomPicture((void*)c<i>,2);
  63.           delay(100);
  64.       }
  65.      }
  66.      else if(n<1){
  67.       for(int i=n;i<1;i++){
  68.         screen.zoomPicture((void*)c<i>,2);
  69.         delay(100);
  70.       }
  71.      }
  72.      else{
  73.       screen.zoomPicture((void*)c[n],2);
  74.       delay(100);
  75.      }
  76.      n=1;
  77.   }
  78.   else if(sensorValue>200){
  79.     if(n>2){
  80.       for(int i=n;i>2;i--){
  81.           screen.zoomPicture((void*)c<i>,2);
  82.           delay(100);
  83.       }
  84.      }
  85.      else if(n<2){
  86.       for(int i=n;i<2;i++){
  87.         screen.zoomPicture((void*)c<i>,2);
  88.         delay(100);
  89.       }
  90.      }
  91.      else{
  92.       screen.zoomPicture((void*)c[n],2);
  93.       delay(100);
  94.      }
  95.      n=2;
  96.   }
  97.   else  if(sensorValue>150){
  98.     if(n>3){
  99.       for(int i=n;i>3;i--){
  100.           screen.zoomPicture((void*)c<i>,2);
  101.           delay(100);
  102.       }
  103.      }
  104.      else if(n<3){
  105.       for(int i=n;i<3;i++){
  106.         screen.zoomPicture((void*)c<i>,2);
  107.         delay(100);
  108.       }
  109.      }
  110.      else{
  111.       screen.zoomPicture((void*)c[n],2);
  112.       delay(100);
  113.      }
  114.      n=3;
  115.   }
  116.   else  if(sensorValue>100){
  117.     if(n>4){
  118.       for(int i=n;i>4;i--){
  119.           screen.zoomPicture((void*)c<i>,2);
  120.           delay(100);
  121.       }
  122.      }
  123.      else if(n<4){
  124.       for(int i=n;i<4;i++){
  125.         screen.zoomPicture((void*)c<i>,2);
  126.         delay(100);
  127.       }
  128.      }
  129.      else{
  130.       screen.zoomPicture((void*)c[n],2);
  131.       delay(100);
  132.      }
  133.      n=4;
  134.   }
  135.   else  if(sensorValue>50){
  136.     if(n>5){
  137.       for(int i=n;i>5;i--){
  138.            screen.zoomPicture((void*)c<i>,2);
  139.           delay(100);
  140.       }
  141.      }
  142.      else if(n<5){
  143.       for(int i=n;i<5;i++){
  144.         screen.zoomPicture((void*)c<i>,2);
  145.         delay(100);
  146.       }
  147.      }
  148.      else{
  149.       screen.zoomPicture((void*)c[n],2);
  150.       delay(100);
  151.      }
  152.      n=5;
  153.   }
  154.   else{  
  155.         buttonState = reading;   
  156.         if (buttonState == HIGH){
  157.       if(n<6){
  158.          for(int i=n;i<6;i++){
  159.         screen.zoomPicture((void*)c<i>,2);
  160.         delay(100);
  161.       }
  162.      }
  163.      else{
  164.       screen.zoomPicture((void*)c[n],2);
  165.       delay(100);
  166.      }
  167.      n=6;}
  168.      else{
  169.       if(n<6){
  170.         for(int i=n;i<=5;i++){
  171.           screen.zoomPicture((void*)c<i>,2);
  172.           delay(100);
  173.         }
  174.       }
  175.        n=5;
  176.      }
  177.    lastButtonState= buttonState;
  178. }
  179. }</i></i></i></i></i></i></i></i></i></i></i></i></i>
复制代码

5.设计外壳以及切割图纸:
如图为模型图片:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图15
如图为切割图纸,单位:mm
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图19
6.切割后的板材以及组装后效果如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图9
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图11
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图12
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图20
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图23
7.烧录代码以及显示效果如图:
串口数据如图:
给万圣节的“恶作剧”加点料-用M0和屏幕结合测距做个APPLE II图21

视频示意:
好了,以上就是本次DIY的全部内容,相关文件都在这里了,欢迎大家和我一起DIY属于自己的APPLE II-惊喜机。
  注意:由于我最后决定使用2mm(实际为1.8mm)的亚克力板作为搭建材料,所以图纸中凹凸的部分尺寸均为1.8mm,朋友你可以根据你实际要使用的板材厚度重新计算得到新的图纸。




创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(6)
jfMTScEaoh0s
jfMTScEaoh0s
搞两个GDL.h干哈?
DFHkLLPkvkd
DFHkLLPkvkd
大佬最强666666666666666666666666666666666666666666666
DFHkhQxFRtP
DFHkhQxFRtP
强无敌
咕叽大虾
咕叽大虾
作者
回复DFHkhQxFRtP
哈哈
针不戳
针不戳
哇塞,辛苦辛苦
咕叽大虾
咕叽大虾
作者
回复针不戳
哈哈做好玩的事情不辛苦
BoBo
BoBo
外观不错,感觉除了给人万圣节惊喜,还可以做为一个桌面摆件完成其他的惊喜任务。
咕叽大虾
咕叽大虾
作者
回复BoBo
嗯嗯!有戏!
hnyzcj
hnyzcj
流弊
咕叽大虾
咕叽大虾
作者
回复hnyzcj
谢谢认可
- 没有更多了 -