pcDuino 书籍_第三章: C语言和pcDuino的Arduino风格IDE (I)

pc朵拉 发布于 2013/08/09 10:31
阅读 1K+
收藏 1
有两种风格在pcDuino上使用C语言,第一种是使用“make”命令行,另外一种是使用Arduino IDE, 该Arduino IDE已经包含在20130531发布的系统版本内。

Arduino风格编程程序库的工具链 

源代码可以用GCC工具链进行编译,GCC已经预装在板子内。你可以在Ubuntu终端的任何目录下输入 ’$gcc'。

注意:你可能需要通过一个桥接板和5V的arduino扩展模块连接使用。
pcDuino板子上所有的输入输出口都是3.3V的IO。
如果arduino的扩展模块需要5V的输入或者输出,就需要在pcDuino上接一块桥接板。否则,如果你直接把arduino的扩展模块连接到pcDuino上,将会损坏pcDuino板子。


命令行风格

pcDuino提供了一些例程来帮助用户快速入手Arduino风格编程。 这些例子为你写自己的程序提供了一个模板。
为了配合本教程的使用,pcDuino板子需要连接到网络,并且运行一个终端。


设置(一次性的):
如果是第一次使用,用如下命令安装 git:
  1. ubuntu@ubuntu :~$ sudo apt-get install git
复制代码
在你的用户目录下输入以下命令:

  1. ubuntu@ubuntu :~$ cd
  2. ubuntu@ubuntu :~$ pwd
  3. /home/Ubuntu
复制代码

现在通过输入以下命令来下载github上的源代码:
  1. ubuntu@ubuntu :~$ git clone https://github.com/pcduino/c_enviroment
  2. Cloning into 'c_enviroment'...
  3. remote: Counting objects: 250, done.
  4. remote: Compressing objects: 100% (166/166), done.
  5. remote: Total 250 (delta 87), reused 232 (delta 69)
  6. Receiving objects: 100% (250/250), 302.59 KiB | 78 KiB/s, done.
  7. Resolving deltas: 100% (87/87), done.
复制代码
下载完成后, 在你的用户目录下,会生成名为“c_enviroment”的文件夹,你可以通过输入‘ls’确认:
  1. ubuntu@ubuntu :~$ ls
  2. Desktop Documents Downloads Music Pictures Public Templates Videos arduino c_enviroment sa
复制代码



熟悉一下目录结构:

进入c_envoroment目录:
  1. ubuntu@ubuntu :~$ cd c_enviroment
  2. ubuntu@ubuntu :~/c_enviroment$ ls
  3. Makefile hardware libraries output sample
复制代码
现在运行“make”来编库和例子程序,命令如下:
  1. ubuntu@ubuntu :~/c_enviroment$ make
复制代码
你可以看到一系列的编译信息:
  1. make[1]: Leaving directory `/home/ubuntu/c_enviroment/sample'
  2. The resulting binary files are found in the output/test folder
  3. ubuntu@ubuntu :~/c_enviroment$ cd output/test
  4. ubuntu@ubuntu :~/c_enviroment/output/test$ ll
  5. total 660
  6. drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 06:59 ./
  7. drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 27 06:49 ../
  8. -rwxrwxr-x 1 ubuntu ubuntu 13868 Apr 27 06:58 adc_test*
  9. -rwxrwxr-x 1 ubuntu ubuntu 28284 Apr 27 06:58 adxl345_test*
  10. -rwxrwxr-x 1 ubuntu ubuntu 14209 Apr 27 06:58 interrupt_test*
  11. -rwxrwxr-x 1 ubuntu ubuntu 13726 Apr 27 06:58 io_test*
  12. -rwxrwxr-x 1 ubuntu ubuntu 13712 Apr 27 06:59 linker_button_test*
  13. -rwxrwxr-x 1 ubuntu ubuntu 13907 Apr 27 06:59 linker_buzzer_test*
  14. -rwxrwxr-x 1 ubuntu ubuntu 13689 Apr 27 06:59 linker_hall_sensor_test*
  15. -rwxrwxr-x 1 ubuntu ubuntu 13760 Apr 27 06:59 linker_joystick_test*
  16. -rwxrwxr-x 1 ubuntu ubuntu 13769 Apr 27 06:59 linker_led_bar_test*
  17. -rwxrwxr-x 1 ubuntu ubuntu 13690 Apr 27 06:59 linker_led_test*
  18. -rwxrwxr-x 1 ubuntu ubuntu 14290 Apr 27 06:59 linker_light_sensor_test*
  19. -rwxrwxr-x 1 ubuntu ubuntu 13696 Apr 27 06:59 linker_magnetic_sensor_test*
  20. -rwxrwxr-x 1 ubuntu ubuntu 14175 Apr 27 06:59 linker_potentiometer_test*
  21. -rwxrwxr-x 1 ubuntu ubuntu 13658 Apr 27 06:59 linker_relay_test*
  22. -rwxrwxr-x 1 ubuntu ubuntu 28530 Apr 27 06:59 linker_rtc_test*
  23. -rwxrwxr-x 1 ubuntu ubuntu 14136 Apr 27 06:59 linker_sound_sensor_test*
  24. -rwxrwxr-x 1 ubuntu ubuntu 13832 Apr 27 06:59 linker_temperature_sensor_test*
  25. -rwxrwxr-x 1 ubuntu ubuntu 13714 Apr 27 06:59 linker_tilt_test*
  26. -rwxrwxr-x 1 ubuntu ubuntu 13689 Apr 27 06:59 linker_touch_sensor_test*
  27. -rwxrwxr-x 1 ubuntu ubuntu 40523 Apr 27 06:58 liquidcrystal_i2c*
  28. -rwxrwxr-x 1 ubuntu ubuntu 40523 Apr 27 06:58 liquidcrystal_spi*
  29. -rwxrwxr-x 1 ubuntu ubuntu 38242 Apr 27 06:59 pn532_readAllMemoryBlocks*
  30. -rwxrwxr-x 1 ubuntu ubuntu 38238 Apr 27 06:59 pn532readMifareMemory*
  31. -rwxrwxr-x 1 ubuntu ubuntu 38240 Apr 27 06:59 pn532readMifareTargetID*
  32. -rwxrwxr-x 1 ubuntu ubuntu 38263 Apr 27 06:59 pn532writeMifareMemory*
  33. -rwxrwxr-x 1 ubuntu ubuntu 13842 Apr 27 06:58 pwm_test*
  34. -rwxrwxr-x 1 ubuntu ubuntu 32336 Apr 27 06:58 serial_test*
  35. -rwxrwxr-x 1 ubuntu ubuntu 14449 Apr 27 06:58 spi_test*
  36. -rwxrwxr-x 1 ubuntu ubuntu 18822 Apr 27 06:59 tone_test*
复制代码
每一个例子的源代码都在例 sample 目录下:
  1. ubuntu@ubuntu :~/c_enviroment/output/test$ cd ../../sample
  2. ubuntu@ubuntu :~/c_enviroment/sample$ ll
  3. total 148
  4. drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 06:49 ./
  5. drwxr-xr-x 7 ubuntu ubuntu 4096 Apr 27 06:58 ../
  6. -rw-rw-r-- 1 ubuntu ubuntu 1368 Apr 27 06:49 Makefile
  7. -rw-rw-r-- 1 ubuntu ubuntu 467 Apr 27 06:49 adc_test.c
  8. -rw-rw-r-- 1 ubuntu ubuntu 6589 Apr 27 06:49 adx.c
  9. -rw-rw-r-- 1 ubuntu ubuntu 5416 Apr 27 06:49 adxl345_test.c
  10. -rw-rw-r-- 1 ubuntu ubuntu 92 Apr 27 06:49 core.h
  11. -rw-rw-r-- 1 ubuntu ubuntu 830 Apr 27 06:49 interrupt_test.c
  12. -rw-rw-r-- 1 ubuntu ubuntu 781 Apr 27 06:49 io_test.c
  13. -rw-rw-r-- 1 ubuntu ubuntu 430 Apr 27 06:49 linker_button_test.c
  14. -rw-rw-r-- 1 ubuntu ubuntu 1420 Apr 27 06:49 linker_buzzer_test.c
  15. -rw-rw-r-- 1 ubuntu ubuntu 390 Apr 27 06:49 linker_hall_sensor_test.c
  16. -rw-rw-r-- 1 ubuntu ubuntu 327 Apr 27 06:49 linker_joystick_test.c
  17. -rw-rw-r-- 1 ubuntu ubuntu 2202 Apr 27 06:49 linker_led_bar_test.c
  18. -rw-rw-r-- 1 ubuntu ubuntu 613 Apr 27 06:49 linker_led_test.c
  19. -rw-rw-r-- 1 ubuntu ubuntu 1197 Apr 27 06:49 linker_light_sensor_test.c
  20. -rw-rw-r-- 1 ubuntu ubuntu 404 Apr 27 06:49 linker_magnetic_sensor_test.c
  21. -rw-rw-r-- 1 ubuntu ubuntu 647 Apr 27 06:49 linker_potentiometer_test.c
  22. -rw-rw-r-- 1 ubuntu ubuntu 331 Apr 27 06:49 linker_relay_test.c
  23. -rw-rw-r-- 1 ubuntu ubuntu 2505 Apr 27 06:49 linker_rtc_test.c
  24. -rw-rw-r-- 1 ubuntu ubuntu 646 Apr 27 06:49 linker_sound_sensor_test.c
  25. -rw-rw-r-- 1 ubuntu ubuntu 1145 Apr 27 06:49 linker_temperature_sensor_test.c
  26. -rw-rw-r-- 1 ubuntu ubuntu 405 Apr 27 06:49 linker_tilt_test.c
  27. -rw-rw-r-- 1 ubuntu ubuntu 389 Apr 27 06:49 linker_touch_sensor_test.c
  28. -rw-rw-r-- 1 ubuntu ubuntu 797 Apr 27 06:49 liquidcrystal_i2c.c
  29. -rw-rw-r-- 1 ubuntu ubuntu 831 Apr 27 06:49 liquidcrystal_spi.c
  30. -rw-rw-r-- 1 ubuntu ubuntu 2002 Apr 27 06:49 pitches.h
  31. -rw-rw-r-- 1 ubuntu ubuntu 3149 Apr 27 06:49 pn532_readAllMemoryBlocks.c
  32. -rw-rw-r-- 1 ubuntu ubuntu 1690 Apr 27 06:49 pn532readMifareMemory.c
  33. -rw-rw-r-- 1 ubuntu ubuntu 1117 Apr 27 06:49 pn532readMifareTargetID.c
  34. -rw-rw-r-- 1 ubuntu ubuntu 2326 Apr 27 06:49 pn532writeMifareMemory.c
  35. -rw-rw-r-- 1 ubuntu ubuntu 498 Apr 27 06:49 pwm_test.c
  36. -rw-rw-r-- 1 ubuntu ubuntu 2079 Apr 27 06:49 serial_test.c
  37. -rw-rw-r-- 1 ubuntu ubuntu 785 Apr 27 06:49 spi_test.c
复制代码
如果要查看代码的内容(我们以linker_led_test.c的内容为例),请输入:
  1. ubuntu@ubuntu :~/c_enviroment/sample$ cat linker_led_test.c
  2. /*
  3. * LED test program
  4. */
  5. #include <core.h>
  6. int led_pin = 1;

  7. void setup()
  8. {
  9. if(argc != 2){
  10. goto _help;
  11. }
  12. led_pin = atoi(argv[1]);
  13. if((led_pin < 0) || (led_pin > 13)){
  14. goto _help;
  15. }
  16. pinMode(led_pin, OUTPUT);
  17. return;

  18. _help:
  19. printf("Usage %s LED_PIN_NUM(0-13)n", argv[0]);
  20. exit(-1);
  21. }
  22. void loop()
  23. {
  24. digitalWrite(led_pin, HIGH); // set the LED on
  25. delay(1000); // wait for a second
  26. digitalWrite(led_pin, LOW); // set the LED off
  27. delay(1000); // wait for a second
  28. }
复制代码
现成代码的编辑:

作为初学者,一开始都是从修改别人的代码开始的,所以你将需要一个文本编辑器。我们倾向于使用nano,但你可能已经有其他常用的文本编辑器,如果没有,输入以下命令安装nano:

  1. ubuntu@ubuntu :~/c_enviroment/sample$ sudo apt-get install nano
复制代码
你应该可以看到nano被下载和安装了。 
我们用上面的源代码为例子,输入:
  1. ubuntu@ubuntu :~/c_enviroment/sample$ nano linker_led_test.c
复制代码
你将看到类似下面的窗口:




对于这个sketch,有一个地方需要注意到的是,它是命令行的风格。这个例子告诉我们当命令行调用的时候,是怎么样将参数传递到Sketch的。这个可选的,在其他的Sketch中你也可能看到,它确实给pcDuino编写sketch带来了一些好处。 

创建你自己的sketch

现在让我们创建自己的Sketch (Arduino圈子里的人,把程序称为Sketch),并成功编译让其运行。按下pin7上的按钮的时候,pin8上的LED灯就亮了。 
在sample文件夹内,输入:
  1. ubuntu@ubuntu :~/c_enviroment/sample$ nano button_led.c
复制代码
一个空白的nano窗口将会跳出。 
将下面的代码复制和粘贴到它里面.(记住将其粘贴到nano里的光标位置,只需点击鼠标即可)
  1. #include <core.h> // Required first line to run on pcDuino
  2. int ledPin = 8;
  3. int buttonPin = 7;
  4. // variables will change:
  5. int buttonState = 0; // variable for reading the pushbutton status

  6. void setup() {
  7. // initialize the LED pin as an output:
  8. pinMode(ledPin, OUTPUT);
  9. // initialize the pushbutton pin as an input:
  10. pinMode(buttonPin, INPUT);
  11. }

  12. void loop(){
  13. // read the state of the pushbutton value:
  14. buttonState = digitalRead(buttonPin);

  15. // check if the pushbutton is pressed.
  16. // if it is, the buttonState is HIGH:
  17. if (buttonState == HIGH) {
  18. // turn LED on:
  19. digitalWrite(ledPin, HIGH);
  20. }
  21. else {
  22. // turn LED off:
  23. digitalWrite(ledPin, LOW);
  24. }
  25. }
复制代码
修改makefile和编译

现在我们需要在sample文件夹里面增加这个新的sketch 到makefil e里。用nano(或者你其他常用的文字编辑器)打开makefile:
  1. ubuntu@ubuntu :~/c_enviroment/sample$ nano Makefile
复制代码
你将会看到所有OBJS分别列出,如下:

  1. OBJS = io_test adc_test pwm_test spi_test adxl345_test serial_test liquidcrystal_i2c liquidcrystal_spi interrupt_test tone_test
  2. OBJS += linker_led_test linker_potentiometer_test linker_tilt_test linker_light_sensor_test linker_button_test
  3. OBJS += linker_touch_sensor_test linker_magnetic_sensor_test linker_temperature_sensor_test linker_joystick_test
  4. OBJS += linker_rtc_test linker_sound_sensor_test linker_buzzer_test linker_hall_sensor_test linker_led_bar_test linker_relay_test
  5. OBJS += pn532_readAllMemoryBlocks pn532readMifareMemory pn532readMifareTargetID pn532writeMifareMemory

复制代码
在文件最后我们将用刚创建的sketch的名字增加一行:
  1. OBJS += button_led
复制代码
注意,我们没有在最后加.c。
保存文件,并用”<CTRL>X“,然后按 'y', 然后”<enter>”退出nano。
  1. ubuntu@ubuntu :~/c_enviroment/sample$ make
复制代码
编译的最后以这样结尾:
  1. button_led.c -o ../output/test/button_led ../libarduino.a
复制代码
如果一切进行顺利,你可以到 "output/test"文件夹找到你已经创建的可执行文件:

  1. ubuntu@ubuntu :~/c_enviroment/sample$ cd ../output/test/
  2. ubuntu@ubuntu :~/c_enviroment/output/test$ ll
  3. total 676
  4. drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 07:51 ./
  5. drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 27 06:49 ../
  6. -rwxrwxr-x 1 ubuntu ubuntu 13868 Apr 27 07:51 adc_test*
  7. -rwxrwxr-x 1 ubuntu ubuntu 28284 Apr 27 07:51 adxl345_test*
  8. -rwxrwxr-x 1 ubuntu ubuntu 13668 Apr 27 07:51 button_led*
  9. …..(not showing rest of listing here)
复制代码
运行你的Sketch:

正确连接LED和按钮开关,输入:
  1. ubuntu@ubuntu :~/c_enviroment/output/test$ ./button_led
复制代码
如果要终止程序,按<Ctrl>C。


快速回顾:
  • 增加#include <core.h>到你的sketch的顶部。
  • 在samples目里面创建你的sketch(你可以建立你自己的目录,如果你对linux, makefiles, 和编译代码熟悉的话)。
  • 在samples文件夹内的Makefile中,添加不带.c文件名到OBJS。
  • 运行make。
  • 从output或者test文件夹中运行可执行文件。
  • 你可以在你的sketch中引入命令行参数以使其更加方便。

C语言风格

出自:http://www.pcduino.org/forum.php?mod=viewthread&tid=211

加载中
返回顶部
顶部