加入交流群  

扫一扫,添加管理员微信
备注:参考设计,即可被拉入群
和也在搞设计小伙伴们碰一碰

收藏 

评论 

蓝猫淘气 发布

【征集令】夜间计算训练器

 
设计简介

为了更好的响应国家双减政策,培养对于社会有用的人才,以及减轻自己哄睡的负担,我制作了一个“夜间计算训练器”。

训练的方法是随机生成运算式,然后通过语音播报的方式要求用户输入。当然为了节省空间,使用了三组船型开关,通过 8421 码的方式进行输入。8421码每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。例如:  输入为1001表示 8+1=9。这样用12个开关能够表示0-999个数字。当然,如果以后上高年级,可以考虑使用10个开关表示 0-1023的数字。 硬件上我们使用 DFRobot出品的ESP32的FireBeetle,配套的萤火虫OLED12864显示屏 和Gravity中英文语音合成模块(基于XFS5152芯片),然后还有用于输入的船型开关。 接下来开始硬件设计,整体电路图如下:


左上角是一个用于消耗电力,保证在充电宝供电的情况下仍能正常工作的部分(大部分充电宝在电流小于100ma的情况下过一段时间会自动切断供电,这里可以通过定时器每隔一段时候拉出一个电流避免这种情况)。上方中间是一个USBTypeA公头,用于外部电源输入。就是说这个设计可以使用FireBeetle上的 Micro USB,也可以使用USBTypeA来进行供电。特别注意需要避免两者同时工作,避免电流倒灌的问题。 左下角是一个键盘矩阵的设计在,其中使用二极管来保证不会有误判情况,这样能够实现判断多个按键同时按下的情况。具体实现是采用动态扫描的方式来进行的,比如:首先拉高KEY_ROW1同时保持KEY_ROW2和KEY_ROW3为低。这时,如果 U1-U4出现接通的情况,对应的KEY_COLx就会出现高电平。接下来再类似操作 KEY_ROW2…...这样就能实现全部按键输入的扫描判断。

语音模块支持串口和I2C这里我们选择 I2C,上面预留了拉高到3.3V的电阻。

可以看到板子上还有三个按键,通过这些按键能够实现菜单的选择以及确认提交输入结果、返回主菜单和重新播报题目的功能。核心的ESP32并非全部引脚都能当成 GPIO使用,如果有不当会导致反复重启,这次设计IO非常紧张:

因为船型开关的存在,整体PCB较大,布线轻松就能完成:

3D渲染

拿到手装配完成:

接下来开始软件部分的设计,代码的状态转移图如下:

关键代码部分如下 1.     在状态1中绘制主菜单,绘制函数如下,显示 Current ,Current+1……Current+3 这三个条目。当有按键时,会将 Current进行增减再重新绘制,这样就实现了菜单的选择功能:

{

];

  OLED.clear();

, MainMenu[Current]);

, Buffer);

) % MENUITEMCOUNTER]);

, Buffer );

) % MENUITEMCOUNTER]);

, Buffer);

) % MENUITEMCOUNTER]);

, Buffer);

  OLED.display();

}
复制代码

2.     状态4中实现了生成算式的功能。使用随机数生成参加运算的数字,同时使用枚举类型定义了四则运算,这样random生成了0-3就对应了4个运算符。

 MATHOPERATION

{

, OPSUB, OPMUL, OPDIV

};

复制代码

以生成两位数相减为例,首先生成2个数字,然后测试运算结果,只有结果不是负数的情况才是一个合格的算式。之后生成的被减数再 Num[0]中,减数在Num[1]中,运算符存放在Op[0]中,正确的结果在Result。

个数字运算

        {

);

;

        }

避免结果是负数

] = OPSUB;

];

        break;
复制代码

3.     算式生成后就是对用户播报的过程,具体在状态5中,可以看到分别读出数值和运算符

]);

]);

]);

)

    {

]);

]);

}
复制代码

数字需要特别处理,为此编写一个函数readValue(),能够输出 0-999的读音:

{

 (NCDEBUG)

  {

);

    Serial.println(Value);

  }

}};

)

  {

]);

]);

)

    {

]);

    }

  }

  {

)

    {

]);

]);

]);

      }

    }

  }

)

  {

]);

  }

)

  {

]);

  }

}
复制代码

4.     接下来在装填6中等待输入,其中GetMatrix()是矩阵扫描函数。前面提到过,基本操作是KEY_ROW1设置为HIGH,KEY_ROW2和KEY_ROW3设置为低,然后读取KEY_COL1-3的电平。需要特别注意的是这个动作完成后必须有足够的延时,否则再拉高KEY_ROW2,再读取KEY_COL1-3的值是不正确的。例如按键如下:

ROW1 ROW2
COL1 闭合(U1) 断开(U1)
COL2 断开(U1) 断开(U1)

开始扫描后,首先设置 COL1=HIGH, COL2=LOW,然后读取 ROW1=HIGH,ROW2=LOW;如果没有加入 Delay 那么接下来会设置COL1=LOW,COL2=HIGH,然后读取 ROW1会得到 HIGH的结果,这是因为ESP32速度很快,ROW1上的电荷还来不及释放掉。

{

;

  digitalWrite(KEY_ROW1, HIGH);

  digitalWrite(KEY_ROW2, LOW);

  digitalWrite(KEY_ROW3, LOW);

);

) +

) +

) +

           digitalRead(KEY_COL4) ;

5.     最后就是等待按下提交键进行判断。image001.png


image003.pngimage005.pngimage007.pngimage009.pngimage011.pngimage013.pngimage016.gif

参考设计图片
×

!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。

 
群聊设计,与管理员及时沟通

欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。

 
查找数据手册?

EEWorld Datasheet 技术支持

论坛推荐 更多
更新时间2024-11-08 12:39:50

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

EEWORLD参考设计中心

站点相关: TI培训 德州仪器(TI)官方视频课程培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved