【全志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.c2 #include <stdio.h>3 #include <wiringPi.h>4 #include <unistd.h>56 #define BEEP 0 //0 设置0脚为蜂鸣器的控制引脚78 int main (void)9 {1011 wiringPiSetup();//初始化wiringPi库1213 pinMode(BEEP, OUTPUT);//设置IO口的输入输出,输出1415 while(1)16 {17 sleep(1);18 digitalWrite (BEEP, HIGH); //设置IO口输出低电平,蜂鸣器响起19 sleep(1);//1s20 digitalWrite (BEEP, LOW);21 }22 return 0;23 }
2、超声波实验
//cs_wave.c1 #include <stdio.h>2 #include <sys/time.h>3 #include <wiringPi.h>4 #include <stdlib.h>5 #include <unistd.h>67 #define Trig 08 #define Echo 1910 double getDistance()11 {12 struct timeval start;13 struct timeval stop;1415 pinMode(Trig,OUTPUT);//IO口初始化,设置IO口的输入输出16 pinMode(Echo,INPUT);//读它的值 输入1718 //1、Trig引脚 由低变高,高电平维持10us19 digitalWrite(Trig,LOW);20 usleep(5);21 digitalWrite(Trig,HIGH);22 usleep(10);23 digitalWrite(Trig,LOW);24 /*以上是初始化超声波*/2526 //2、模块内部开自动发波2728 //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 高电平持续时间3435 long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);36 double dis = (double)diffTime/1000000*34000/2;//强转3738 return dis;3940 }
3.1、全志怎么配置定时器
- 全志 通过定时器一秒输出一句Hello
//clock.c1 #include <stdio.h>2 #include <sys/time.h>3 #include <stdlib.h>4 #include <signal.h>5 static int i;67 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,黑色GND1 #include <stdio.h>2 #include <sys/time.h>3 #include <stdlib.h>4 #include <signal.h>5 #include <wiringPi.h>67 #define SG90Pin 5//定义5脚为舵机信号线89 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<=jd)
17 {
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 }
欢迎大家一起交流讨论!