查看: 789|回复: 8

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

[复制链接]
本帖最后由 咕叽大虾 于 2020-11-3 09:30 编辑

         一直以来我都是一个不经吓的人,我很清楚但也都坦然接受了(主动锻炼一下胆量?不存在的不存在的),直到有一天在办公室,我正专心盯着屏幕工作着,一个同事突然站在我旁边讲话,把我吓得弹跳一下,差点原地升天,我就知道是时候做点什么努力了。于是,接下来两天我很慎重的思考了一下去鬼屋的可行性,结果当然是打死不去了!那该怎么办呢,后来我灵机一动,或许可以给自己设计一个小装置用来提醒我有人正在接近,而我也需要它能不动声色的提醒我却不被来人发现,或许如果有人真的想在万圣节这样的节日给我一个“惊喜”,那么就不要怪我皮一下啦,我可以给他介绍一下我的新玩具,引导它近距离观察装置,当距离小到一定范围内时,我的装置也可以”惊喜“一下它。
        对了,或许有朋友知道1977年推出的Apple II个人电脑吗,虽然和后来大名鼎鼎的有“白雪公主设计语言”的Apple IIC比起来它似乎存在感不那么强,但它的推出确实掀起了个人电脑革命, Apple II的设计和当时别的电脑的设计非常不同,它看起来更像家用电器,拆箱即可使用,因此无论是办公还是家用都很合适。我第一次在设计史的课堂上见到它就印象深刻,像这样的具有传奇色彩的产品,一直以来都在我的梦想产品清单里。正好这次要DIY”惊喜“机,于是结合我手里有的一些器件我决定给自己设计一个迷你APPLE II-”惊喜“机,算是了了两个心愿,快乐值加倍!朋友们也可以动手做起来哦,简单有用还有趣,文末可以感受到我安利的诚意。那接下来简要介绍一下这次的小应用思路,如图:
RS23}035L)ADDCJEIVSMUHF.png
好的,那么开始之前先看一下成品图!
IMG_20201031_141358.jpg

D7532AF2C346D2B2F151AC74D8446F27.jpg

一、硬件准备

1.Firebeetle Board-M0(V1.0)    X1(DFR0652)
https://www.dfrobot.com.cn/goods-2854.html
2.8” 320x240 IPS TFT 电阻触摸显示屏    X1(DFR0665)
https://www.dfrobot.com.cn/goods-2876.html
3.Gravity:URM09-模拟量超声波测距传感器   X1(SEN0307)
https://www.dfrobot.com.cn/goods-1954.html
4. 四脚按键开关    X1
5.220欧电阻    X1
6. 杜邦线若干
7.Gravity 3P线    X1
8.GDI连接线(长度最好选择20cm或30cm的)     X1   (FIT0692)
https://www.dfrobot.com.cn/goods-2837.html
9.type-c线  X1

如图:
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)主体代码
[AppleScript] 纯文本查看 复制代码
#include "SPI.h"
#include <DFRobot_GDL.h>
#include "DFRobot_GDL.h"

#define screen_CS         5
#define screen_DC         7
#define screen_LED        0
#define screen_RST        6

//DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
//DFRobot_ST7789_240x320_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
//DFRobot_ILI9341_240x320_HW_SPI  screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
//DFRobot_ILI9488_320x480_HW_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
/* M0 mainboard DMA transfer */
//DFRobot_ST7789_240x240_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
//DFRobot_ST7789_240x320_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
DFRobot_ILI9341_240x320_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);
//DFRobot_ILI9488_320x480_DMA_SPI screen(/*dc=*/screen_DC,/*cs=*/screen_CS,/*rst=*/screen_RST);

long time3;      
int sensorPin=A3;
int buttonPin=3;
int sensorValue=0;
int buttonState;
int lastButtonState = LOW; 
int n=0;

const unsigned char *c[7]={
gImage_1,
gImage_2,
gImage_3,
gImage_4,
gImage_5,
gImage_6,
gImage_7
};

void setup() {
  // put your setup code here, to run once:
  pinMode(buttonPin,INPUT);
  Serial.begin(9600);
  screen.begin();
  time3 = millis();
  Serial.println(millis()-time3);
}



void loop() {
  // put your main code here, to run repeatedly:
  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);
  int reading = digitalRead(buttonPin);
  if(sensorValue>300){
    if(n>0){
      for(int i=n;i>0;i--){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=0;
  }
  else if(sensorValue>250){
    if(n>1){
      for(int i=n;i>1;i--){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else if(n<1){
      for(int i=n;i<1;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=1;
  }
  else if(sensorValue>200){
    if(n>2){
      for(int i=n;i>2;i--){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else if(n<2){
      for(int i=n;i<2;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=2;
  }
  else  if(sensorValue>150){
    if(n>3){
      for(int i=n;i>3;i--){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else if(n<3){
      for(int i=n;i<3;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=3;
  }
  else  if(sensorValue>100){
    if(n>4){
      for(int i=n;i>4;i--){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else if(n<4){
      for(int i=n;i<4;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=4;
  }
  else  if(sensorValue>50){
    if(n>5){
      for(int i=n;i>5;i--){
           screen.zoomPicture((void*)c[i],2);
          delay(100);
      }
     }
     else if(n<5){
      for(int i=n;i<5;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=5;
  }
  else{  
        buttonState = reading;   
        if (buttonState == HIGH){
      if(n<6){
         for(int i=n;i<6;i++){
        screen.zoomPicture((void*)c[i],2);
        delay(100);
      }
     }
     else{
      screen.zoomPicture((void*)c[n],2);
      delay(100);
     }
     n=6;}
     else{
      if(n<6){
        for(int i=n;i<=5;i++){
          screen.zoomPicture((void*)c[i],2);
          delay(100);
        }
      }
       n=5;
     }
 
   lastButtonState= buttonState;
}
}
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
7.烧录代码以及显示效果如图:
串口数据如图:
串口数据.gif

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

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

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail