新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/article/202412/465455.htm

        可以用來做一個!原理很簡單,也很有趣

        不但好玩解壓!還能學(xué)一學(xué)粒子運動算法!

        一、功能/亮點

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

        • 采用粒子運動算法,通過控制LED燈珠的亮滅,模擬流麻運動。

        • 采用LED點陣屏,2.5mm間距;分辨率32×64

        • PCB板尺寸8mm*16mm,支持免費打樣

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

        下面逐個分享

        二、硬件設(shè)計

        原理圖1

        原理圖2

        PCB圖1

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

        1.硬件工作原理

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

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

        2.設(shè)計說明

        ①關(guān)于供電

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

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

        其中左邊三個是暫時沒有用到的,可以不焊接。

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

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

        具體怎么做?

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

        使用keil5搭配CubeMX來編程,使用的庫是HAL庫

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

        1.MPU6050模塊

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

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

        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;

        啥意思?

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

        值得一提的是!

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

        3.依次更新

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

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

        我們在高中物理學(xué)過,加速度在時間上的累計就是速度,速度在時間上的累計就是位移。

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

        加速度對時間的積分為速度,速度對時間的積分為位移。

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

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

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

        當(dāng)位移超過1時,就代表粒子應(yī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;
         }
        }

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

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

        DIY物料有哪些?

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

        2.補(bǔ)充清單

        參考資料:

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



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

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 屏东市| 五台县| 潢川县| 交城县| 讷河市| 辽阳县| 盐池县| 黄冈市| 化德县| 惠水县| 绥滨县| 甘孜县| 法库县| 铜鼓县| 大悟县| 中卫市| 游戏| 东乡| 颍上县| 星子县| 婺源县| 连州市| 威海市| 耒阳市| 奉新县| 沈阳市| 岳普湖县| 北宁市| 新和县| 楚雄市| 鹤峰县| 兰坪| 斗六市| 信阳市| 深州市| 辰溪县| 民乐县| 宁津县| 自治县| 三门县| 黑水县|