【全志H616】1 --用orangepi控制硬件
本文介绍了如歌用orangepi 控制蜂鸣器&超声波模块,通过键盘输入1、2、3、4来控制转动角度舵机模块;同时还介绍了利用全志如何配置定时器;以及查看H616引脚状态的命令等…
- 超声波模块和舵机模块的讲解,在我之前写的博客里面啦
https://blog.csdn.net/Super_Fisher_man/article/details/135577251
- 引脚说明
gpio readall //查看H616的引脚情况,及其状态
1、蜂鸣器实验
1 //beep.c 2 #include 3 #include 4 #include 5 6 #define BEEP 0 //0 设置0脚为蜂鸣器的控制引脚 7 8 int main (void) 9 { 10 11 wiringPiSetup();//初始化wiringPi库 12 13 pinMode(BEEP, OUTPUT);//设置IO口的输入输出,输出 14 15 while(1) 16 { 17 sleep(1); 18 digitalWrite (BEEP, HIGH); //设置IO口输出低电平,蜂鸣器响起 19 sleep(1);//1s 20 digitalWrite (BEEP, LOW); 21 } 22 return 0; 23 }
2、超声波实验
//cs_wave.c 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 #define Trig 0 8 #define Echo 1 9 10 double getDistance() 11 { 12 struct timeval start; 13 struct timeval stop; 14 15 pinMode(Trig,OUTPUT);//IO口初始化,设置IO口的输入输出 16 pinMode(Echo,INPUT);//读它的值 输入 17 18 //1、Trig引脚 由低变高,高电平维持10us 19 digitalWrite(Trig,LOW); 20 usleep(5); 21 digitalWrite(Trig,HIGH); 22 usleep(10); 23 digitalWrite(Trig,LOW); 24 /*以上是初始化超声波*/ 25 26 //2、模块内部开自动发波 27 28 //3、直到 Echo 变为1,才执行下面的程序,否者卡住 29 while(!digitalRead(Echo));//读 Echo 的值;要用digitalRead()函数 30 gettimeofday(&start,NULL); 31 //4、直到 Echo 变为0,才执行下面程序 32 while(digitalRead(Echo)); 33 gettimeofday(&stop,NULL);//抓取两次时间,计算出时间差,得出 Echo 高电平持续时间 34 35 long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec); 36 double dis = (double)diffTime/1000000*34000/2;//强转 37 38 return dis; 39 40 }
3.1、全志怎么配置定时器
- 全志 通过定时器一秒输出一句Hello
//clock.c 1 #include 2 #include 3 #include 4 #include 5 static int i; 6 7 void signal_handler(int signum) 8 { 9 //1000 0.5*2000 10 i++; 11 if(i == 2000) 12 { 13 printf("hello\n"); 14 i = 0; 15 } 16 } 17 18 19 int main() 20 { 21 struct itimerval itv; 22 //设定定时时间 23 itv.it_interval.tv_sec = 0; 24 itv.it_interval.tv_usec = 500;//0.5ms发送一次信号 25 //设定开始生效,启动定时器的时间 26 itv.it_value.tv_sec = 1; 27 itv.it_value.tv_usec = 0; 28 //设定定时方式 29 if(setitimer(ITIMER_REAL,&itv,NULL)) //SIGALRM 30 { 31 //ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。 32 //ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。 33 //ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。 34 perror("error"); 35 exit(-1); 36 } 37 //信号处理 38 signal(SIGALRM,signal_handler);//这边需要捕获对应的信号进行逻辑相关处理 39 //接收信号,跳到signal_handler函数 40 41 while(1); 42 return 0; 43 44 }
3.2 舵机开发:通过键盘输入1、2、3、4来控制转动角度
// sg90.c // 橙色线,信号,红色VCC,黑色GND 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 #define SG90Pin 5//定义5脚为舵机信号线 8 9 int jd = 2; 10 11 12 void signal_handler(int signum) 13 { 14 static int i; 15 //500ms, 2/40 = 1/20 为高电平 16 if(i 18 digitalWrite(SG90Pin,HIGH); 19 } 20 else 21 { 22 digitalWrite(SG90Pin,LOW); 23 } 24 if(i == 40) 25 { 26 i = 0; 27 } 28 i++; 29 } 30 31 32 int main() 33 { 34 struct itimerval itv; 35 jd = 0; 36 wiringPiSetup(); 37 pinMode(SG90Pin, OUTPUT);//定义为输出 38 39 //设定定时时间 40 itv.it_interval.tv_sec = 0; 41 itv.it_interval.tv_usec = 500;//0.5ms发送一次信号 42 //设定开始生效,启动定时器的时间 43 itv.it_value.tv_sec = 1; 44 itv.it_value.tv_usec = 0; 45 //设定定时方式 46 if(setitimer(ITIMER_REAL,&itv,NULL)) //SIGALRM 47 { 48 //ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。 49 //ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。 50 //ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。 51 perror("error"); 52 exit(-1); 53 } 54 //信号处理 55 signal(SIGALRM,signal_handler);//这边需要捕获对应的信号进行逻辑相关处理 56 //接收信号,跳到signal_handler函数 57 58 while(1) 59 { 60 printf("input jd:1-0、2-45、3-90,4-135\n"); 61 scanf("%d",&jd); 62 63 } 64 return 0; 65 66 }
- 全志 通过定时器一秒输出一句Hello
- 引脚说明