<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 有閑置屏幕?別丟!做個(gè)電子流麻,美汁汁!

          有閑置屏幕?別丟!做個(gè)電子流麻,美汁汁!

          作者: 時(shí)間:2024-12-12 來(lái)源:嘉立創(chuàng) 收藏

          家里有閑置的屏幕?別丟!

          本文引用地址:http://www.ex-cimer.com/article/202412/465455.htm

          可以用來(lái)做一個(gè)!原理很簡(jiǎn)單,也很有趣

          不但好玩解壓!還能學(xué)一學(xué)粒子運(yùn)動(dòng)算法!

          一、功能/亮點(diǎn)

          • 基于F407天空星開發(fā)板設(shè)計(jì)

          • 采用粒子運(yùn)動(dòng)算法,通過(guò)控制LED燈珠的亮滅,模擬流麻運(yùn)動(dòng)。

          • 采用LED點(diǎn)陣屏,2.5mm間距;分辨率32×64

          • PCB板尺寸8mm*16mm,支持免費(fèi)打樣

          那么,想實(shí)現(xiàn)真實(shí)的流麻效果,怎么設(shè)計(jì)軟硬件?原理是啥?怎么準(zhǔn)備DIY物料?

          下面逐個(gè)分享

          二、硬件設(shè)計(jì)

          原理圖1

          原理圖2

          PCB圖1

          *參考設(shè)計(jì)部分:供電部分的設(shè)計(jì)參考了@小煜哥哥的IP5306簡(jiǎn)易18650充電寶方案

          1.硬件工作原理

          采用MPU6050模塊來(lái)獲取中,粒子的水平和垂直加速度,通過(guò)I2C協(xié)議將采集的加速度數(shù)據(jù)傳到單片機(jī)

          單片機(jī)根據(jù)加速度數(shù)據(jù)來(lái)計(jì)算所有粒子的位置,并將結(jié)果顯示上。

          2.設(shè)計(jì)說(shuō)明

          ①關(guān)于供電

          采用IP5306芯片為一節(jié)18650鋰電池充電,并將鋰電池升壓到5v,為及單片機(jī)供電

          ②為啥板子上有四個(gè)按鍵開關(guān)?

          其中左邊三個(gè)是暫時(shí)沒有用到的,可以不焊接。

          已知,硬件設(shè)計(jì),是為了“裝下”流麻。

          軟件設(shè)計(jì),就是為了“實(shí)現(xiàn)”流麻。

          具體怎么做?

          三、軟件設(shè)計(jì)教程

          使用keil5搭配CubeMX來(lái)編程,使用的庫(kù)是HAL庫(kù)

          *MPU6050的程序我參考了@江科大的教程中軟件I2C讀寫MPU6050的源碼。

          1.MPU6050模塊

          使用MPU6050_GetData函數(shù)即可讀取當(dāng)前水平加速度垂直加速度的值

          注意I2C使用的SDA和SCL引腳,都要在程序中設(shè)置為開漏輸出而不是推挽輸出。別問(wèn)我怎么知道的

          2.定義結(jié)構(gòu)體并初始化

          typedef struct{
           float Acce_x;  float Speed_x;//當(dāng)前粒子x軸速度
           float Displacement_x;//當(dāng)前粒子x軸位移
           uint16_t Position_x;//當(dāng)前粒子x軸位置
           float Acce_y;  float Speed_y;//當(dāng)前粒子y軸速度
           float Displacement_y;//當(dāng)前粒子y軸位移
           uint16_t Position_y;//當(dāng)前粒子y軸位置
           uint16_t Color;  uint16_t Index;  float Random_Acce;
          }easy_pixel;

          啥意思?

          這部分代碼 主要對(duì)粒子進(jìn)行初始化,定義單個(gè)粒子的信息,對(duì)其進(jìn)行賦值。定義的內(nèi)容包括:加速度,速度,位移,位置,顏色等。

          值得一提的是!

          初始化是指,在這一步,給流麻的像素塊上色的過(guò)程。

          3.依次更新

          void Update_State(easy_pixel* p, float AX, float AY){
           Update_Acce(p, AX, AY);
           Update_Speed(p);
           Update_Displacement(p);
          }

          那怎么依次更新粒子的加速度、速度、位移?

          我們?cè)诟咧形锢韺W(xué)過(guò),加速度在時(shí)間上的累計(jì)就是速度,速度在時(shí)間上的累計(jì)就是位移。

          或者換成更嚴(yán)謹(jǐn)一點(diǎn)的描述。

          加速度對(duì)時(shí)間的積分為速度,速度對(duì)時(shí)間的積分為位移。

          在程序中,可以很方便的實(shí)現(xiàn)積分的功能。

          只需要定義一個(gè)最小時(shí)間單位,將每次循環(huán)得到的加速度乘以這個(gè)最小的時(shí)間單位,再累加起來(lái)就可以得到速度。

          同理,累加速度可以得到位移。

          當(dāng)位移超過(guò)1時(shí),就代表粒子應(yīng)該移動(dòng)一格。

          4.更新所有粒子的信息

          void Update_Group_State(easy_pixel* p, float AX, float AY){  for(uint16_t i = 0;i < Init_Height * Init_Width;i++){
             Update_State(p, AX, AY);
             p += 1;
           }
          }

          本項(xiàng)目總共有512個(gè)粒子。也就是說(shuō),將上一小節(jié)的步驟重復(fù)512次,就可以完成一次更新全部粒子。

          本小節(jié)的函數(shù)寫在while(1)循環(huán)中,這使得程序可以不斷更新所有粒子的狀態(tài),流沙就可以在上流動(dòng)起來(lái)了。

          DIY物料有哪些?

          1.基礎(chǔ)物料清單表

          2.補(bǔ)充清單

          參考資料:

          [1]https://oshwhub.com/lemon11111/electronic-liuma



          關(guān)鍵詞: 電子流麻 STM32 LED屏幕

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();