接线

IN方向的针脚

Arduino Uno — MAX7219

5V <—> VCC

GND <—> GND

12 <—> DIN

11 <—> CS

10 <—> CLK

所需的库

https://github.com/wayoda/LedControl

代码

#include <LedControl.h>byte e[8]=     {0x7C,0x7C,0x60,0x7C,0x7C,0x60,0x7C,0x7C};  //E
byte d[8]=     {0x78,0x7C,0x66,0x66,0x66,0x66,0x7C,0x78};  //D
byte u[8]=     {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x7E};  //U
byte c[8]=     {0x7E,0x7E,0x60,0x60,0x60,0x60,0x7E,0x7E};  //C
byte eight[8]= {0x7E,0x7E,0x66,0x7E,0x7E,0x66,0x7E,0x7E};  //8
byte s[8]=     {0x7E,0x7C,0x60,0x7C,0x3E,0x06,0x3E,0x7E};  //S
byte dot[8]=   {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18};  //.
byte o[8]=     {0x7E,0x7E,0x66,0x66,0x66,0x66,0x7E,0x7E};  //O
byte m[8]=     {0xE7,0xFF,0xFF,0xDB,0xDB,0xDB,0xC3,0xC3};  //M
byte smile[8]=   {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};//笑脸
byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};//标准脸LedControl lc=LedControl(12,11,10,4);void setup(){lc.shutdown(0,false);       //启动时,MAX72XX处于省电模式lc.setIntensity(0,8);       //将亮度设置为最大值lc.clearDisplay(0);         //清除显示
}void loop(){ printByte(smile);//显示8delay(1000);//延时1秒printByte(neutral);//显示标准脸delay(1000);
}//点阵显示函数
void printByte(byte character [])
{int i = 0;for(i=0;i<8;i++){lc.setRow(0,i,character[i]);}
}

点阵+胳膊

#include <Servo.h>
#include <Oscillator.h>
#include <EEPROM.h>
#include <LedControl.h>
#include <FlexiTimer2.h>#define N_SERVOS 6 // 共6个舵机
#define PIN_AR 7 // 右胳膊
#define PIN_AL 6 // 左胳膊
#define PIN_RR 5 // 右脚
#define PIN_RL 4 // 左脚
#define PIN_YR 3 // 右腿
#define PIN_YL 2 // 左腿
#define INTERVALTIME 10.0 Oscillator servo[N_SERVOS];
LedControl lc=LedControl(12,10,11,4);byte smile[8]=   {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};//笑脸
byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};//标准脸
byte sad[8] = {0x3C,0x42,0xA5,0x81,0x99,0xA5,0x42,0x3C};//悲伤脸
byte tbyte[8] = {0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18};
byte obyte[8]=     {0x7E,0x7E,0x66,0x66,0x66,0x66,0x7E,0x7E};  //Obyte ddd[8] = { 0x00,0x7E,0x81,0x81,0x81,0x81,0x81,0x7E};
byte kkk[8] = {0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00};
byte xxx[8] = {0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00};
byte zzz[8] = {0x00,0x00,0x7E,0xC3,0x7E,0x00,0x00,0x00};void goingUp(int tempo);
void drunk (int tempo);
void noGravity(int tempo);
void kickLeft(int tempo);
void kickRight(int tempo);
void run(int steps, int T=500);
void walk(int steps, int T=1000);
void backyard(int steps, int T=3000);
void backyardSlow(int steps, int T=5000);
void turnLeft(int steps, int T=3000);
void turnRight(int steps, int T=3000);
void moonWalkLeft(int steps, int T=1000);
void moonWalkRight(int steps, int T=1000);
void crusaito(int steps, int T=1000);
void swing(int steps, int T=1000);
void upDown(int steps, int T=1000);
void flapping(int steps, int T=1000);void event()
{static int tmr = 0;if(tmr == 0) printByte(kkk);if(tmr == 1) printByte(xxx);if(tmr == 2) printByte(zzz);if(tmr == 3) printByte(xxx);if(tmr == 4) printByte(zzz);if(tmr == 5) printByte(xxx);if(tmr == 6) printByte(zzz);if(tmr == 8) printByte(xxx);if(tmr == 9) printByte(kkk);tmr++;if(tmr >= 10){tmr = 0;}
}void setup()
{lc.shutdown(0,false);       //启动时,MAX72XX处于省电模式lc.setIntensity(0,8);       //将亮度设置为最大值lc.clearDisplay(0);         //清除显示Serial.begin(9600);Serial.println("Hello OTTO~");//设置舵机引脚servo[0].attach(PIN_RR);servo[1].attach(PIN_RL);servo[2].attach(PIN_YR);servo[3].attach(PIN_YL);servo[4].attach(PIN_AR); //右胳膊 90-垂下去、0-平直servo[5].attach(PIN_AL); //左胳膊 90-垂下去、180-平直for(int i=0;i<6;i++) // 舵机归位{servo[i].SetPosition(90);}FlexiTimer2::set(500,1.0/2,event);FlexiTimer2::start();/*printByte(kkk);delay(500);printByte(xxx);delay(500);printByte(zzz);delay(500);printByte(xxx);delay(500);printByte(zzz);delay(500);printByte(xxx);delay(500);printByte(zzz);delay(500);printByte(ddd);delay(500);printByte(xxx);delay(500);printByte(kkk);delay(500);*/}int t=495;
double pause=0;void loop()
{dance();
//  for(int i=0;i<6;i++) //舵机归位
//  {
//      servo[i].SetPosition(90);
//  }
}//点阵显示函数
void printByte(byte character [])
{int i = 0;for(i=0;i<8;i++){lc.setRow(0,i,character[i]);}
}void dance()
{primera_parte();/*segunda_parte();*/moonWalkLeft(4,t*2);moonWalkRight(4,t*2);moonWalkLeft(4,t*2);moonWalkRight(4,t*2);/*primera_parte(); crusaito(1,t*8);crusaito(1,t*7);/*/*for (int i=0; i<16; i++){flapping(1,t/4);delay(3*t/4);}moonWalkRight(4,t*2);moonWalkLeft(4,t*2);moonWalkRight(4,t*2);moonWalkLeft(4,t*2);*//*drunk(t*4);drunk(t*4);drunk(t*4);drunk(t*4);kickLeft(t);kickRight(t);drunk(t*8);drunk(t*4);drunk(t/2);delay(t*4); *//*drunk(t/2);delay(t*4); walk(2,t*2);backyard(2,t*2);goingUp(t*2);goingUp(t*1);noGravity(t*2);crusaito(1,t*2);crusaito(1,t*8);crusaito(1,t*2);crusaito(1,t*8);crusaito(1,t*2);crusaito(1,t*3);*//*delay(t);primera_parte();for (int i=0; i<32; i++){flapping(1,t/2);delay(t/2);}*/for(int i=0;i<4;i++) servo[i].SetPosition(90);
}//FUNCIONES DE CONTROL//void oscillate(int A[N_SERVOS], int O[N_SERVOS], int T, double phase_diff[N_SERVOS]){for (int i=0; i<4; i++) {servo[i].SetO(O[i]);servo[i].SetA(A[i]);servo[i].SetT(T);servo[i].SetPh(phase_diff[i]);}double ref=millis();for (double x=ref; x<T+ref; x=millis()){for (int i=0; i<4; i++){servo[i].refresh();}}
}unsigned long final_time;
unsigned long interval_time;
int oneTime;
int iteration;
float increment[N_SERVOS];
int oldPosition[]={90,90,90,90};void moveNServos(int time, int  newPosition[]){for(int i=0;i<N_SERVOS;i++)   increment[i] = ((newPosition[i])-oldPosition[i])/(time/INTERVALTIME);final_time =  millis() + time; iteration = 1; while(millis() < final_time){ //Javi del futuro cambia esto  interval_time = millis()+INTERVALTIME;  oneTime=0;      while(millis()<interval_time){      if(oneTime<1){ for(int i=0;i<N_SERVOS;i++){servo[i].SetPosition(oldPosition[i] + (iteration * increment[i]));}         iteration++;oneTime++;}}     }   for(int i=0;i<N_SERVOS;i++){  oldPosition[i] = newPosition[i];}
}//
PASOS DE BAILE
//void goingUp(int tempo){pause=millis();for(int i=0;i<4;i++) servo[i].SetPosition(90);delay(tempo);servo[0].SetPosition(80);servo[1].SetPosition(100);delay(tempo);servo[0].SetPosition(70);servo[1].SetPosition(110);delay(tempo);servo[0].SetPosition(60);servo[1].SetPosition(120);delay(tempo);servo[0].SetPosition(50);servo[1].SetPosition(130);delay(tempo);servo[0].SetPosition(40);servo[1].SetPosition(140);delay(tempo);servo[0].SetPosition(30);servo[1].SetPosition(150);delay(tempo);servo[0].SetPosition(20);servo[1].SetPosition(160);delay(tempo);while(millis()<pause+8*t);}void primera_parte(){int move1[4] = {60,120,90,90};int move2[4] = {90,90,90,90};int move3[4] = {40,140,90,90};for(int x=0; x<3; x++){for(int i=0; i<3; i++){lateral_fuerte(1,t/2);lateral_fuerte(0,t/4);lateral_fuerte(1,t/4);delay(t);}pause=millis();for(int i=0;i<4;i++) servo[i].SetPosition(90);moveNServos(t*0.4,move1);moveNServos(t*0.4,move2);while(millis()<(pause+t*2));}for(int i=0; i<2; i++){lateral_fuerte(1,t/2);lateral_fuerte(0,t/4);lateral_fuerte(1,t/4);delay(t);}/*pause=millis();for(int i=0;i<4;i++) servo[i].SetPosition(90);crusaito(1,t*1.4);moveNServos(t*1,move3);for(int i=0;i<4;i++) servo[i].SetPosition(90);while(millis()<(pause+t*4));*/
}void segunda_parte(){int move1[4] = {90,90,80,100};int move2[4] = {90,90,100,80};int move3[4] = {90,90,80,100};int move4[4] = {90,90,100,80};int move5[4] = {40,140,80,100};int move6[4] = {40,140,100,80};int move7[4] = {90,90,80,100};int move8[4] = {90,90,100,80};int move9[4] = {40,140,80,100};int move10[4] = {40,140,100,80};int move11[4] = {90,90,80,100};int move12[4] = {90,90,100,80};for(int x=0; x<7; x++){ for(int i=0; i<3; i++){pause=millis();moveNServos(t*0.15,move1);moveNServos(t*0.15,move2);moveNServos(t*0.15,move3);moveNServos(t*0.15,move4);while(millis()<(pause+t));}pause=millis();moveNServos(t*0.15,move5);moveNServos(t*0.15,move6);moveNServos(t*0.15,move7);moveNServos(t*0.15,move8);while(millis()<(pause+t));}for(int i=0; i<3; i++){pause=millis();moveNServos(t*0.15,move9);moveNServos(t*0.15,move10);moveNServos(t*0.15,move11);moveNServos(t*0.15,move12);while(millis()<(pause+t));}
}void lateral_fuerte(boolean side, int tempo)
{for(int i=0;i<6;i++)//舵机归位 {servo[i].SetPosition(90);}if (side){     servo[0].SetPosition(40);}else {servo[1].SetPosition(140);}delay(tempo/2);servo[0].SetPosition(90);servo[1].SetPosition(90);delay(tempo/2);
}void drunk (int tempo){pause=millis();int move1[] = {60,70,90,90};int move2[] = {110,120,90,90};int move3[] = {60,70,90,90};int move4[] = {110,120,90,90};moveNServos(tempo*0.235,move1);moveNServos(tempo*0.235,move2);moveNServos(tempo*0.235,move3);moveNServos(tempo*0.235,move4);while(millis()<(pause+tempo));}void noGravity(int tempo){int move1[4] = {120,140,90,90};int move2[4] = {140,140,90,90};int move3[4] = {120,140,90,90};int move4[4] = {90,90,90,90};for(int i=0;i<4;i++) servo[i].SetPosition(90);for(int i=0;i<N_SERVOS;i++) oldPosition[i]=90;moveNServos(tempo*2,move1);moveNServos(tempo*2,move2);delay(tempo*2);moveNServos(tempo*2,move3);moveNServos(tempo*2,move4);}void kickLeft(int tempo){for(int i=0;i<4;i++) servo[i].SetPosition(90);delay(tempo);servo[0].SetPosition(50); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo);servo[0].SetPosition(80); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo/4);servo[0].SetPosition(30); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo/4);servo[0].SetPosition(80); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo/4);servo[0].SetPosition(30); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo/4);servo[0].SetPosition(80); //pie derechoservo[1].SetPosition(70); //pie izquierodelay(tempo);
}void kickRight(int tempo){
for(int i=0;i<4;i++) servo[i].SetPosition(90);delay(tempo);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(130); //pie izquierodelay(tempo);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(100); //pie izquierodelay(tempo/4);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(150); //pie izquierodelay(tempo/4);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(80); //pie izquierodelay(tempo/4);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(150); //pie izquierodelay(tempo/4);servo[0].SetPosition(110); //pie derechoservo[1].SetPosition(100); //pie izquierodelay(tempo);
}void walk(int steps, int T){int A[4]= {15, 15, 30, 30};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void run(int steps, int T){int A[4]= {10, 10, 10, 10};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void backyard(int steps, int T){int A[4]= {15, 15, 30, 30};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(-90), DEG2RAD(-90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void backyardSlow(int steps, int T){int A[4]= {15, 15, 30, 30};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(-90), DEG2RAD(-90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void turnLeft(int steps, int T){int A[4]= {20, 20, 10, 30};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void turnRight(int steps, int T){int A[4]= {20, 20, 30, 10};int O[4] = {0, 0, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void moonWalkRight(int steps, int T){int A[4]= {25, 25, 0, 0};int O[4] = {-15 ,15, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 + 120), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void moonWalkLeft(int steps, int T){int A[4]= {25, 25, 0, 0};int O[4] = {-15, 15, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 - 120), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void crusaito(int steps, int T){int A[4]= {25, 25, 30, 30};int O[4] = {- 15, 15, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 + 120), DEG2RAD(90), DEG2RAD(90)}; for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void swing(int steps, int T){int A[4]= {25, 25, 0, 0};int O[4] = {-15, 15, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void upDown(int steps, int T){int A[4]= {25, 25, 0, 0};int O[4] = {-15, 15, 0, 0};double phase_diff[4] = {DEG2RAD(180), DEG2RAD(0), DEG2RAD(270), DEG2RAD(270)};for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void flapping(int steps, int T){int A[4]= {15, 15, 8, 8};int O[4] = {-A[0], A[1], 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180), DEG2RAD(90), DEG2RAD(-90)};for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}void test(int steps, int T){int A[4]= {15, 15, 8, 8};int O[4] = {-A[0] + 10, A[1] - 10, 0, 0};double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180), DEG2RAD(90), DEG2RAD(-90)};for(int i=0;i<steps;i++)oscillate(A,O, T, phase_diff);
}

OTTO机器人之MAX7219点阵相关推荐

  1. DIY制作otto机器人

    DIY制作otto机器人 外型 3D打印 SolidWorks 三维机器人原理图 成品涂色 硬件 准备 连接安装 软件 准备 Arduino程序 成品 后续 外型 3D打印 3D打印技术出现在20世纪 ...

  2. 【Arduino】OTTO机器人(做二次开发的一点点总结)

    偶然一个机会得以接触一下Arduino,了解一下Arduino代码的编写模式,接触了C++函数封装,算是真正接触了一下项目开发,也意识到项目开发中的种种问题不是写代码能解决的,在阅读别人代码时也需要有 ...

  3. 使用自己开发的app远程控制MAX7219点阵屏幕

    使用自己开发的app远程控制MAX7219点阵屏幕 一.功能介绍: 二.芯片介绍: 三.实现原理: 四.代码部分: 其它资料: 一.功能介绍: 1.可以固定显示想显示的内容 2.点阵屏幕在无指令的时候 ...

  4. OTTO机器人之APP蓝牙控制

    链接:https://pan.baidu.com/s/1POunQmWerG3q4SvvxlMs3g 密码:ht3d 主要修改的地方,其一是蓝牙的Mode,其二是程序和蓝牙的波特率要对应! (注意下载 ...

  5. OTTO机器人之太空舞步实现(带胳膊+不带胳膊)

    不带胳膊的版本 #include <Servo.h> #include <Oscillator.h> #include <EEPROM.h>#define N_SE ...

  6. OTTO机器人之胳膊测试

    #include <Servo.h> #include <Oscillator.h> #include <US.h> #include <Otto.h> ...

  7. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  8. 【51单片机】MAX7219 LED点阵GUI设计

    文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 三.软件设计 1.软件结构 2.主要代码 四.实验现象 联系作者 一.主要功能 LED点阵显示初始信息,可通过K3键切换显示模式,可实 ...

  9. PCA9685版OTTO开源跳舞机器人

    PCA9685版OTTO开源跳舞机器人 正文 关于OTTO开源跳舞机器人 PCA9685库文件 Oscillater.cpp文件: Oscillator.h文件 主程序:nanoPca9685ODan ...

最新文章

  1. 再谈变分自编码器VAE:从贝叶斯观点出发
  2. 1970 matla 时间_关于matlab:UTC到字符串的转换时间
  3. 序列化和反序列化的概念_序列化的概念
  4. DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen
  5. 水系图一般在哪里找得到_进展 | 水系钠离子电池研究取得重要进展
  6. 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...
  7. 重新添加MySQL服务
  8. 【Yarn】Yarn 命令详解
  9. SQL2005数据库连接
  10. 小学音乐教学和计算机的融合,【多媒体技术论文】小学音乐多媒体教学融入策略问题(共5881字)...
  11. 关于 java jdk 环境变量的配置
  12. JavaScript String 对象、Math 对象使用详解
  13. Oracle 从入门到精通系列 - 资料下载
  14. UI设计原型交互基础
  15. 在资源管理器中不小心关掉了什么,win10桌面不见了,变黑了
  16. 阿里云商标注册查询入口(支持图形检索/45分类注册风险)
  17. python数据分析多元 线性回归
  18. mtk kernel
  19. Mysql:Got error 28 from storage engine
  20. 00无人机简介以及课程介绍2020-07-03

热门文章

  1. 计算机867怎么学,2018年考研湖南大学867计算机系统考试大纲
  2. linux硬件级虚拟机系统 电脑安桌游戏多开完全去除vm标识去虚拟化
  3. 默然说话20160101
  4. kruskal C++
  5. mysql国内研究现状_Php+Mysql技术的研究现状和发展趋势
  6. esp32与ros2的开关灯
  7. 4. Java并发编程-管程
  8. 中国女排世界排名跌至第二,为何排名下跌?郎平这样回答
  9. 【cocos2d-x制作别踩白块儿】第六期:游戏交互实现
  10. c语言程序立体几何计算机,立体几何教学中巧妙利用信息技术 -----培养高中学生数学学习的兴趣   张芬     2014年11月10日...