• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 有閑置屏幕?別丟!做個電子流麻,美汁汁!

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

    作者: 時間:2024-12-12 來源:嘉立創 收藏

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

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

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

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

    一、功能/亮點

    • 基于F407天空星開發板設計

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

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

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

    那么,想實現真實的流麻效果,怎么設計軟硬件?原理是啥?怎么準備DIY物料?

    下面逐個分享

    二、硬件設計

    原理圖1

    原理圖2

    PCB圖1

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

    1.硬件工作原理

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

    單片機根據加速度數據來計算所有粒子的位置,并將結果顯示上。

    2.設計說明

    ①關于供電

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

    ②為啥板子上有四個按鍵開關?

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

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

    軟件設計,就是為了“實現”流麻。

    具體怎么做?

    三、軟件設計教程

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

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

    1.MPU6050模塊

    使用MPU6050_GetData函數即可讀取當前水平加速度垂直加速度的值

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

    2.定義結構體并初始化

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

    啥意思?

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

    值得一提的是!

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

    3.依次更新

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

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

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

    或者換成更嚴謹一點的描述。

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

    在程序中,可以很方便的實現積分的功能。

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

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

    當位移超過1時,就代表粒子應該移動一格。

    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個粒子。也就是說,將上一小節的步驟重復512次,就可以完成一次更新全部粒子。

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

    DIY物料有哪些?

    1.基礎物料清單表

    2.補充清單

    參考資料:

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



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 濮阳市| 雷波县| 张家界市| 慈溪市| 龙海市| 方山县| 连州市| 苏尼特右旗| 湟源县| 藁城市| 汉川市| 文昌市| 邵东县| 三门县| 资兴市| 巴彦淖尔市| 固阳县| 宁国市| 平利县| 永春县| 璧山县| 巴马| 六安市| 沭阳县| 合作市| 江陵县| 正定县| 忻州市| 绥滨县| 崇阳县| 闻喜县| 望奎县| 吉木萨尔县| 淮南市| 湘乡市| 琼结县| 沂源县| 平昌县| 鲜城| 阿合奇县| 金门县|