4012浏览
查看: 4012|回复: 10

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

[复制链接]
一直以来我都是一个不经吓的人,我很清楚但也都坦然接受了(主动锻炼一下胆量?不存在的不存在的),直到有一天在办公室,我正专心盯着屏幕工作着,一个同事突然站在我旁边讲话,把我吓得弹跳一下,差点原地升天,我就知道是时候做点什么努力了。于是,接下来两天我很慎重的思考了一下去鬼屋的可行性,结果当然是打死不去了!那该怎么办呢,后来我灵机一动,或许可以给自己设计一个小装置用来提醒我有人正在接近,而我也需要它能不动声色的提醒我却不被来人发现,或许如果有人真的想在万圣节这样的节日给我一个“惊喜”,那么就不要怪我皮一下啦,我可以给他介绍一下我的新玩具,引导它近距离观察装置,当距离小到一定范围内时,我的装置也可以”惊

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



一、硬件准备

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
序号名称 数量


如图:
IMG_20201029_161944.jpg
二、软件准备
序号 名称
1 Arduino IDE
2 Img2Lcd(将图片转换为代码信息)

三、具体操作
1.硬件连接(如图)  
连线图 - 副本.png
IMG_20201029_230115.jpg

  将排针焊在M0上,这里需要用到一个模拟引脚一个数字引脚(我这里数字引脚是3,和按钮连接在一起;模拟引脚是A3,和测距传感器连接在一起)(垃圾焊接技术轻喷,我会继续好好练习的,如果你有什么焊接小技巧,欢迎评论区留言)。如图为我的M0焊接情况:
IMG_20201029_230417.jpg
B3_RXG0}S%$SJRU6HYWYHO3.png
    如图为我的按钮焊接情况:其中,在焊接接地杜邦线前焊接了一个220欧电阻。
VT3[`@5D$]T9J68W4]@2[ZT.png
2. 处理图片
    如图为我下载的一个表情图片以及一张万圣节图片,于是我得到了7张新图(将图片全部裁剪成4:3后旋转90°)命名为1-7。如图:
}538}@O46}C(MJ[05HW$$~U.png
打开软件Img2Lcd,百度一下即可下载。导入图片,如图设置(此处我将图片设定为60*80)后,得到7个c类文件。如图:
]QSP%2NF36OF{RYE@$Z21O5.png
6}HGEB}VCW2S_@9$FTBV7I5.png
3.下载GDL库文件(屏幕的库文件)

    链接如下。
0RL_Q{TV0$UT19~VVBU}4X4.png
   下载解压后将库加载到Arduino的库中。
4.梳理代码
    依据前文提到的设计思路,只需要在合适的距离s时调用正确对应的图片显示即可。整理代码如下(复制即可使用):
    1)将图片信息复制到代码开始的位置,如图表示即可(由于图片信息代码量太大,此处示意):
HD0G_U5V{JCJT37%O_IHE$F.png
      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.设计外壳以及切割图纸:
如图为模型图片:
QQ图片20201030145407.png
如图为切割图纸,单位:mm
B_TQ_R5DXQ9N{$E]}@7NSOE.png
6.切割后的板材以及组装后效果如图:
IMG_20201029_164337-02.jpeg
IMG_20201029_165120-01.jpeg
IMG_20201030_172753-01.jpeg
IMG_20201030_172852-01.jpeg
D7532AF2C346D2B2F151AC74D8446F27.jpg
7.烧录代码以及显示效果如图:
串口数据如图:
串口数据.gif

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

hnyzcj  版主

发表于 2020-10-31 17:18:41

流弊
回复

使用道具 举报

咕叽大虾  初级技师
 楼主|

发表于 2020-11-2 09:06:43


谢谢认可
回复

使用道具 举报

BoBo  NPC

发表于 2020-11-3 09:57:52

外观不错,感觉除了给人万圣节惊喜,还可以做为一个桌面摆件完成其他的惊喜任务。
回复

使用道具 举报

咕叽大虾  初级技师
 楼主|

发表于 2020-11-4 12:15:50

BoBo 发表于 2020-11-3 09:57
外观不错,感觉除了给人万圣节惊喜,还可以做为一个桌面摆件完成其他的惊喜任务。 ...

嗯嗯!有戏!
回复

使用道具 举报

针不戳  学徒

发表于 2020-11-8 22:14:14

哇塞,辛苦辛苦
回复

使用道具 举报

咕叽大虾  初级技师
 楼主|

发表于 2020-11-11 17:57:44


哈哈做好玩的事情不辛苦
回复

使用道具 举报

DFHkhQxFRtP  学徒

发表于 2020-11-15 18:25:35

强无敌
回复

使用道具 举报

咕叽大虾  初级技师
 楼主|

发表于 2020-11-16 11:42:36

回复

使用道具 举报

DFHkLLPkvkd  见习技师

发表于 2021-2-5 13:11:41

大佬最强666666666666666666666666666666666666666666666
回复

使用道具 举报

jfMTScEaoh0s  见习技师

发表于 2022-2-13 11:47:36

搞两个GDL.h干哈?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail