【全志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 <stdio.h>
3 #include <wiringPi.h>
4 #include <unistd.h>
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 <stdio.h>
2 #include <sys/time.h>
3 #include <wiringPi.h>
4 #include <stdlib.h>
5 #include <unistd.h>
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 <stdio.h>
2 #include <sys/time.h>
3 #include <stdlib.h>
4 #include <signal.h>
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 <stdio.h>
2 #include <sys/time.h>
3 #include <stdlib.h>
4 #include <signal.h>
5 #include <wiringPi.h>
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<=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 }
欢迎大家一起交流讨论!