亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino Pong Game on 24x16 Matrix with MAX7219

组件和用品

Arduino Nano R3
× 1
MAX7219 8x8 LED 矩阵模块
× 6
旋转电位器(通用)
× 2
蜂鸣器
× 1

必要的工具和机器

烙铁(通用)

应用和在线服务

Arduino IDE

关于这个项目

我在 6 个阵列上构建了这个小型乒乓球控制台。根据说明和代码的 8x8 LED 矩阵:https://www.instructables.com/id/Pong/

我没有使用定制的矩阵板,而是从 Aliexpress 购买了带有 MAX7219 的廉价现成 8x8 模块。

每块板的“时钟”和“负载”引脚都连接在一起。第一个矩阵的“Din”引脚到Arduino,“Dout”到下一个矩阵的“Din”等。控制桨是两个10k电位器连接到Arduino的A0和A1模拟引脚,蜂鸣器连接到D9引脚。

最后我把设备放在一个塑料盒里,把控制器放在盒子里进行电气安装。

您可以从以下位置下载 LedControl 库:

https://github.com/wayoda/LedControl

代码

  • 代码
代码Arduino
//我们总是要包含库#include "LedControl.h" byte rightscore;字节左分; inttoneloop=1000;字节pongdisplay [] ={//用于在启动时以显示 “傍” B11111111,B00000000,B00001001,B00000000,B00001001,B00000000,B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000,B00000000,B10001000,B00000000,B10001000 ,B00000000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B11110000,B00000000,B00001000,B00000000,B00001000,B00000000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B11001111,B00000000,B10001001,B00000000,B10001001,B00000000 , B11111111, B00000000, B00000000, B00000000, B00000000, B00000000, }; byte zero[]={ // 用于在显示分数时显示'0' B00000000, B00000000, B00111100, B01000010, B01000010, B01000010, B00111100, B0000000 }; byte one[]={ // 用于在显示分数时显示'1' B00000000, B00000000, B10001000, B10000100, B11111110, B10000000, B10000000, B0000000 }; byte two[]={ // 用于显示'2'用于显示分数 B00000000, B01100010, B01010001, B01010001, B01001001, B01000110, B00000000, B000000, B000000 用于显示三个[byte]{0}; 3' 用于显示分数 B00000000, B00100110, B01000001, B01001001, B00110110, B00000000, B00000000, B00000000};byte 四 []10 时用于显示 B01001001, B00110000, B0000004,04,04,04,040 时B00001000,B00001000,B11111111,B00000000,B00000000};字节5 [] ={//用于显示一个 '5' 显示得分B00000000时,B00000000,B10011110,B10010010,B10010010,B11110010,B00000000,B00000000};字节displayevens =0;byte displayrow=0;byte displayindex=0;byte displayodds=1;unsigned long time;unsigned long currenttime;/* 现在我们需要一个 LedControl 来使用。引脚 12 连接到 DataIn 引脚 11 连接到 CLK 引脚 10 连接到 LOAD 我们有 6 个 MAX72XX。 */字节模式;字节偏转;字节进位;int行;LedControl lc=LedControl(12,11,10,6);long randnumber;byte dir;int startpos;byte row;byte column;long randNumber;byte start;byte diry;int pass;byte limit;#define leftpaddle 0 //left pong 旋钮连接到模拟输入 0#define rightpaddle 1 // 右 pong 旋钮连接到模拟输入 1int directionpong;int rightpongval;int leftpongval;byteblinkx;byte乒乓[] ={//商店球和桨B00000000的位置,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 ,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 , B00000000, B00000000, B00000000, B00000000, B00000000};无效设置(){ pinMode(左桨,输入); //桨是一个输入。 pinMode(右桨,输入); // 桨是一个输入。 Serial.begin(9600); // 用于调试的串行通信。设置为 9600 波特 // 下面的这些语句经过并将矩阵设置为给定的设置 lc.shutdown(0,false); lc.setIntensity(0,1); lc.clearDisplay(0); lc.shutdown(1,false); lc.setIntensity(1,1); lc.clearDisplay(1); lc.shutdown(2,false); lc.setIntensity(2,1); lc.clearDisplay(2); lc.shutdown(3,false); lc.setIntensity(3,1); lc.clearDisplay(3); lc.shutdown(4,false); lc.setIntensity(4,1); lc.clearDisplay(4); lc.shutdown(5,false); lc.setIntensity(5,1); lc.clearDisplay(5); while(displayevens<5){ while(displayrow<=7){ lc.setRow(displayevens,displayrow,pongdisplay[displayindex]);显示行++;显示索引+=2; } displayrow=0; displayevens+=2; } displayrow=0;显示索引=1;随机种子(模拟读取(4));开始=1;时间=毫秒();当前时间=毫秒(); while(currenttime-time<3000){ leftpongval=analogRead(leftpaddle); leftpongval=map(leftpongval,1023,20,2,0); if(leftpongval==0){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,false); lc.setLed(3,4,7,false);模式=1;极限=2; } if(leftpongval==1){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,true); lc.setLed(3,4,7,false);模式=2;极限=1; } if(leftpongval==2){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,true); lc.setLed(3,4,7,true);模式=3;极限=2; } 延迟(50); lc.clearDisplay(3);当前时间=毫秒(); } } void loop(){ 桨(); pongsim();显示屏(); } void paddles(){ //从桨中读取数据并将其显示在数组中 int searchbit; int进位=0; // Serial.print("LeftPaddle:"); // Serial.println(analogRead(leftpaddle)); leftpongval=analogRead(leftpaddle); leftpongval=map(leftpongval,0,1010,0,13); rightpongval=analogRead(rightpaddle); rightpongval=map(rightpongval,1023,20,0,13); // Serial.print("RightPaddle:"); // Serial.println(rightpongval); //清除前一个桨以显示下一个 pong[0]=B00000000;乒乓[1]=B00000000;乒乓[46]=B00000000;乒乓[47]=B00000000; //-------------------------------右桨 if(mode!=3){ if(rightpongval<=7) { rightpongval=map(rightpongval,0,7,7,0); bitSet(pong[46], rightpongval); if(rightpongval-1>=0){ bitSet(pong[46],rightpongval-1); } else{ bitSet(pong[47], 7); if(mode!=2){ bitSet(pong[47],6);进位=1; } } if(mode!=2){ if(carry==0){ if(rightpongval-2>=0){ bitSet(pong[46], rightpongval-2); } else{ bitSet(pong[47], 7);进位=1; } } } } if(rightpongval>7){ rightpongval=map(rightpongval,8,13,7,limit);位集(乒乓[47],rightpongval); bitSet(pong[47],rightpongval-1); if(mode!=2){ bitSet(pong[47],rightpongval-2); } } } else{ 乒乓[46]=B11111111;乒乓[47]=B11111111; lc.setRow(4,7,pong[46]); lc.setRow(5,7,pong[47]); } //-----------------------------------左桨进位=0; if(leftpongval<=7){ leftpongval=map(leftpongval,0,7,7,0); bitSet(pong[0], leftpongval); if(leftpongval-1>=0){ bitSet(pong[0],leftpongval-1); } else{ bitSet(pong[1], 7); if(mode!=2){ bitSet(pong[1],6);进位=1; } } if(mode!=2){ if(carry==0){ if(leftpongval-2>=0){ bitSet(pong[0], leftpongval-2); } else{ bitSet(pong[1], 7); } } } } if(leftpongval>7){ leftpongval=map(leftpongval,8,13,7,limit);位集(乒乓 [1],leftpongval); bitSet(pong[1],leftpongval-1); if(mode!=2){ bitSet(pong[1],leftpongval-2); } } }void pongsim(){ if( ((line==2 || line==3) &&diry ==0) || ((line==44 || line==45) &&diry==1) ){ ball_meets_paddle(); } if(start==1){ // 开始新游戏 randnumber=random(1,7); // 想出一个随机起始位 dir=random(2); // 想出一个从左到右或从右到左的随机开始运动 diry=random(2); // 想出一个随机的起始 y 移动方向 if(diry==0){ // 如果 y 方向为 0。从下往上移动 line=random(30,34); // 想出一个 30-34 bitSet(pong[line],randnumber) 之间的随机起始行; // 将随机线上的位设置为 pong 数组中的随机位等于 1 } if(diry==1){ // 如果 y 方向为 1。从上到下的运动 line=random(12,16); // 想出一个 12-16 之间的随机起始线 bitSet(pong[line],randnumber); // 将随机线上的位设置为 pong 数组中的随机位等于 1 } start=0; // 将起始变量设置为 0 } if(diry==0){ // 如果球从底部移动到顶部 if(dir==0){ // 如果球从右向左移动 if (deflect==0 &&Carry==0){ // 如果球没有偏转或转移到另一条矩阵线-=2; // 通过从线 pong[line]=pong[line+2] <<1 中减去 2 将球推向另一侧;// 将球向左移动并使其等于新线 pong[line+2] =B00000000; // 清除球的旧线 } if(carry==1){ // 如果球必须转移到新的矩阵 line-=3; // 通过从线 pong[line]=B00000001 中减去 3 将球推向另一侧; // 设置新行 pong[line+3]=B00000000; //清除球carry=0的旧线; // 将进位变量设置回 0 return; // 到这里就完成了 } if(deflect==1){ // 如果球必须偏离墙线-=2; // 通过从线 pong[line]=B01000000 中减去 2 将球推向另一侧; // 设置新行 pong[line+2]=B00000000; // 清除球的旧线 deflect=0; // 将偏转变量设置回 0 dir=1; // 切换方向从左到右 return; // 到这里就完成了 } if(bitRead(pong[line],7)==1){ // 如果球在这条线的第 7 位 if(line==3|| line==5 || line==7 || line==9 || line==11 || line==13 || line==15 || // 如果是奇数线 line==17 || line==19 | | line==21 || line==23 || line==25 || line==27 || line==29 || line==31 || line==33 || line==35 || line ==37 || 行==39 || 行==41 || 行==43 || 行==45){ 进位=1; // 球需要结转到另一个矩阵 return; // 我们到此完成 } else{ // 否则球在偶数线上 if(line!=2){ // 线不能是 2,因为球在 2 deflect=1 处与桨相遇; // 球需要偏离墙壁返回; // 我们在这里完成了 } } } } // 上面的注释应该解释下面的所有内容。一些东西,不同的参数。 if(dir==1){ if(deflect==0 &&Carry==0){ line-=2; pong[line]=pong[line+2]>> 1;乒乓[线+2]=B00000000; } if(carry==1){ line--;乒乓[线]=B10000000;乒乓[线+1]=B00000000;进位=0;返回; } if(deflect==1){ line-=2;乒乓[线]=B00000010;乒乓[线+2]=B0000000;偏转=0;目录=0;返回; } if(bitRead(pong[line],0)==1){ if( line==2 || line==4 || line==6 || line==8 || line==10 || line ==12 || line==14 || line==16 || line==18 || line==20 || line==22 || line==24 || line==26 || line==28 || line==30 || line==32 || line==34 || line==36|| line==38 || line==40 ||line==42 || line==44 ) {进位=1;返回; } else{ if(line!=3){ deflect=1;返回; } } } } }//------------------------------------------- -diry =1 下面 if(diry==1){ if(dir==0){ if(deflect==0 &&Carry==0){ line+=2; pong[line]=pong[line-2] <<1; pong[line-2]=B00000000; } if(carry==1){ line+=1;乒乓[线]=B00000001; pong[line-1]=B00000000;进位=0;返回; } if(deflect==1){ line+=2;乒乓[线]=B01000000; pong[line-2]=B00000000;偏转=0;目录=1;返回; } if(bitRead(pong[line],7)==1){ if( line==5 || line==7 || line==9 || line==11 || line==13 || line ==15 || line==17 || line==19 || line==21 || line==23 || line==25 || line==27 || line==29 || line==31 || line==33 || line==35 || line==37 || line==39|| line==41 ||line==43 || line==45){ Carry=1;返回; } else{ if(line!=44){ deflect=1;返回; } } } } if(dir==1){ if(deflect==0 &&Carry==0){ line+=2; pong[line]=pong[line-2]>> 1; pong[line-2]=B00000000; } if(carry==1){ line+=3;乒乓[线]=B10000000; pong[line-3]=B00000000;进位=0;返回; } if(deflect==1){ line+=2;乒乓[线]=B00000010; pong[line-2]=B0000000;偏转=0;目录=0;返回; } if(bitRead(pong[line],0)==1){ if(line==2|| line==4 || line==6 || line==8 || line==10 || line ==12 || line==14 || line==16 || line==18 || line==20 || line==22 || line==24 || line==26 || line==28 || line==30 || line==32 || line==34 || line==36|| line==38 || line==40 ||line==42 || line==44 ) {进位=1;返回; } else{ if(line!=45){ deflect=1;返回; } } } } }}void displayscreen(){ displayevens=0;显示行=0;显示索引=0; displayodds=1; while(displayevens<5){ while(displayrow<=7){ lc.setRow(displayevens,displayrow,pong[displayindex]);显示行++;显示索引+=2; } displayrow=0; displayevens+=2; } displayrow=0;显示索引=1; while(displayodds<6){ while(displayrow<8){ lc.setRow(displayodds,displayrow,pong[displayindex]);显示行++;显示索引+=2; } displayrow=0; displayodds+=2; }} void clearscreen(){ int clearing=0; while(clearing<49){ pong[clearing]=B00000000;清算++; }}void ball_meets_paddle(){ byte search1=0; if(diry==0){ // 球向上移动 if(dir==0){ // 球从右向左移动 while(search1<8){ // 找到球所在的位置 if(bitRead(pong) [line],search1)==1){ //找到球所在的位 if(line==2){ if(search1!=6 &&search1!=7){ //如果它在第 2 行,使确保它不在那些特殊位上 if( bitRead(pong[0], search1)==1){ // 检查那里是否有桨 diry=1; //切换y方向,使其朝向其他桨音(9,500,100); } else if( bitRead(pong[0], search1+1)==1){ diry=1;目录=1;音调(9,500,100); if(search1==0){进位=1; } } else { // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==6){ //特殊位,需要偏转它进来的相同路径 if(bitRead(pong[0],7)==1){ //那里有一个桨 pong[2] =B01000000;目录=1;脏=1;音调(9,500,100); } else{//错过了,没有桨。音调(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==7){//特殊位,需要先跳墙 if(bitRead(pong[0],6)==1){// 找到桨 pong[2]=B00100000;脏=1;目录=1;线=2;音调(9,500,100);显示屏(); } else{//错过了,没有桨。音调(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } } if(line==3){ if(search1!=7){ //如果它在第3行,确保它不在那些特殊位上 if(bitRead(pong[1], search1)==1) { // 检查那里是否有桨 diry=1; //切换y方向,使其朝向其他桨音(9,500,100); } else if( bitRead(pong[1], search1+1)==1){ diry=1;目录=1;音调(9,500,100); } else { // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==7){//特殊位,需要结转到下一个矩阵 if(bitRead(pong[1],7)==1){ //在那里找到一个桨 //pong[2] =B10000000; //清除它在dir=0上的行; //方向相同diry=1; // y 方向改变色调(9,500,100); } else if(bitRead(pong[0],0)==1){ dir=1;脏=1;音调(9,500,100);进位=0; } else{// 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } } } search1++; } } if(dir==1){//球从左向右移动 while(search1<8){ //找到球所在的位置 if(bitRead(pong[line],search1)==1) { //找到球所在的位 if(line==3){ if(search1!=1 &&search1!=0){ //如果它在第 3 行,请确保它不在特殊位 if( bitRead(pong[1], search1)==1){ //检查是否有桨 diry=1; // 切换 y 方向,使球朝向另一个桨音(9,500,100); } else if(bitRead(pong[1], search1-1)==1){ diry=1;目录=0;音调(9,500,100); if(search1==7){进位=1; } } else{ // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==1){ if(bitRead(pong[1],0)==1){ pong[3]=B00000010;目录=0;脏=1;音调(9,500,100); }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==0){ if(bitRead(pong[1],0)==1){ pong[3]=B00000100;脏=1;目录=0;线=3;音调(9,500,100);显示屏(); }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } } if(line==2){ if(search1!=0){ if(bitRead(pong[0], search1)==1){ //检查是否有paddle diry=1; // 切换 y 方向,使球朝向另一个桨音(9,500,100); } else if(bitRead(pong[0], search1-1)==1){ diry=1;目录=0;音调(9,500,100); } else{ // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } if(search1==0){ if(bitRead(pong[0],0)==1){ // pong[2]=B00000001;线=2;目录=1;脏=1;音调(9,500,100);返回; } else if(bitRead(pong[1],7)==1){ diry=1;目录=0;音调(9,500,100);进位=0; }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分左(); } } } } search1++; } } }//----------------------------------------- ------------------------- if(diry==1){ // 球向上移动 if(dir==0){ //球移动从右到左 while(search1<8){ //找到球所在的位 if(bitRead(pong[line],search1)==1){ //找到球所在的位 if(line==44){ if( search1!=6 &&search1!=7){ //如果它在第 2 行,请确保它不在那些特殊位上 if( bitRead(pong[46], search1)==1){ //检查那里是否有桨 diry=0; //切换y方向,使其朝向其他桨音(9,500,100); } else if( bitRead(pong[46], search1+1)==1){ diry=0;目录=1;音调(9,500,100); if(search1==0){进位=1; } } else { // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==6){ //特殊位,需要偏转它进来的相同路径 if(bitRead(pong[46],7)==1){ //那里有一个桨 dir=1;脏=0;音调(9,500,100); } else{//错过了,没有桨。音调(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==7){//特殊位,需要先跳墙 if(bitRead(pong[46],6)==1){// 找到桨 pong[44]=B00100000;脏=0;目录=1;音调(9,500,100);显示屏();线=44;返回; } } } if(line==45){ if(search1!=7){ //如果它在第 3 行,请确保它不在那些特殊位上 if( bitRead(pong[47], search1)==1) { // 检查那里是否有桨 diry=0; //切换y方向,使其朝向其他桨音(9,500,100); } else if( bitRead(pong[47], search1+1)==1){ diry=0;目录=1;音调(9,500,100); } else { // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==7){//特殊位,需要结转到下一个矩阵 if(bitRead(pong[47],7)==1){ //在那里找到一个paddle // pong[45] =B10000000; //清除 line=45 上的行;目录=0; //方向相同diry=0; // y 方向改变色调(9,500,100); } else if(bitRead(pong[46],0)==1){ dir=1;脏=0;音调(9,500,100);进位=0; } else{// 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } } } search1++; } } if(dir==1){//球从左向右移动 while(search1<8){ //找到球所在的位置 if(bitRead(pong[line],search1)==1) { //找到球所在的位 if(line==45){ if(search1!=1 &&search1!=0){ //如果它在第 3 行,确保它不在特殊位 if( bitRead(pong[47], search1)==1){ //检查是否有桨 diry=0; // 切换 y 方向,使球朝向另一个桨音(9,500,100); } else if(bitRead(pong[47], search1-1)==1){ diry=0;目录=0;音调(9,500,100); if(search1==7){进位=1; } } else{ // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==1){ if(bitRead(pong[47],0)==1){ pong[43]=B00000010;目录=0;脏=0;音调(9,500,100); }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==0){ if(bitRead(pong[47],1)==1){ pong[45]=B00000100;脏=0;目录=0;线=45;音调(9,500,100);显示屏(); }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } } if(line==44){ if(search1!=0){ if(bitRead(pong[46], search1)==1){ //检查是否有paddle diry=0; // 切换 y 方向,使球朝向另一个桨音(9,500,100); } else if(bitRead(pong[46], search1-1)==1){ diry=0;目录=0;音调(9,500,100); } else{ // 没有桨,错过了球音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } if(search1==0){ if(bitRead(pong[46],0)==1){ pong[44]=B00000001;线=44;目录=1;脏=0;音调(9,500,100); } else if(bitRead(pong[47],7)==1){ dir=0;脏=0;音调(9,500,100);进位=0; }其他{音(9,500,300);清屏();开始=1;延迟(1000);得分权(); } } } } search1++; } } } 通=1; search1=0;}void scoreleft(){ clearscreen(); rightcore++;设置分数();显示屏(); if(rightscore==5){ while(blinkx++<4){ clearscreen();显示屏();延迟(500);设置分数();显示屏();延迟(500); } 闪烁x=0;权利分数=0; leftscore=0; }其他{延迟(2000); } clearscreen();}void scoreright(){ clearscreen(); leftscore++;设置分数();显示屏(); if(leftscore==5){ while(blinkx++<4){ clearscreen();显示屏();延迟(500);设置分数();显示屏();延迟(500); } 闪烁x=0;权利分数=0; leftscore=0; }其他{延迟(2000); } clearscreen();}void setscore(){ byte setScoreLoop=0; while(setScoreLoop<=7){ if(leftscore==0){ pong[setScoreLoop*2]=zero[setScoreLoop]; } if(leftscore==1){ pong[setScoreLoop*2]=one[setScoreLoop]; } if(leftscore==2){ pong[setScoreLoop*2]=two[setScoreLoop]; } if(leftscore==3){ pong[setScoreLoop*2]=three[setScoreLoop]; } if(leftscore==4){ pong[setScoreLoop*2]=four[setScoreLoop]; } if(leftscore==5){ pong[setScoreLoop*2]=five[setScoreLoop]; } if(rightscore==0){ pong[32+(setScoreLoop*2)]=zero[setScoreLoop]; } if(rightscore==1){ pong[32+(setScoreLoop*2)]=one[setScoreLoop]; } if(rightscore==2){ pong[32+(setScoreLoop*2)]=two[setScoreLoop]; } if(rightscore==3){ pong[32+(setScoreLoop*2)]=three[setScoreLoop]; } if(rightscore==4){ pong[32+(setScoreLoop*2)]=four[setScoreLoop]; } if(rightscore==5){ pong[32+(setScoreLoop*2)]=five[setScoreLoop]; } setScoreLoop++; } 乒乓[20]=B00011000;乒乓[22]=B00011000;乒乓[24]=B00011000; } 

示意图


制造工艺

  1. Arduino Gyroscope Game with MPU-6050
  2. Arduino Pong Game - OLED 显示器
  3. Arduino 游戏控制器
  4. 使用 Arduino 控制硬币接收器
  5. Arduino Pong Game on 24x16 Matrix with MAX7219
  6. 自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏
  7. Arduino 带蓝牙控制 LED!
  8. 像素追逐游戏
  9. 使用 Arduino Uno 控制 LED 矩阵
  10. NeoMatrix Arduino Pong
  11. 使用 Arduino 测量太阳辐射
  12. 带 WS2812 LED 灯条的 DIY Arduino 1D 乒乓球游戏