【全志H616】1 --用orangepi控制硬件

【全志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 }

欢迎大家一起交流讨论!

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值