Kursy • Poradniki • Inspirujące DIY • Forum
Zanim zaczniemy korzystać z Arduino musimy zainstalować środowisko. Ja wybrałem domyślną lokalizację: C:\Program Files (x86)\Arduino. Nie przepadam za nazwami katalogów zawierającymi spacje, chodziło jednak o opisanie typowej instalacji. Stąd Windows i taka lokalizacja plików.
Niezbędny przykładowy kod
Przykładowy program, to znany "Blink" skrócony o przydługie komentarze. Program można łatwo skompilować oraz uruchomić – chyba każdy kto bawił się Arduino ma to za sobą:
Ważna uwaga – domyślne nazwy programów mogą utrudnić dalsze prace, warto więc zapisać projekt w znanym miejscu i pod łatwo rozpoznawalną nazwą. Ja zdecydowałem się na test1, co może nie jest idealnym wyborem, ale daje się szybko rozpoznać wśród innych plików.
Jak widzimy, środowisko robi wszystko za nas. Wystarczy nacisnąć kilka przycisków i dioda na Arduino zacznie migać. Spróbujmy jednak dowiedzieć się jaka magia się za tym wszystkim kryje.
Więcej informacji w konsoli Arduino IDE
Najpierw sprawmy, żeby Arduino IDE było nieco bardziej wylewne podczas pracy. Okazuje się, że wystarczy wybrać odpowiednią opcję - z menu Plik wybieramy polecenie Preferencje. Powinniśmy zobaczyć okno z konfiguracją programu:
W powyższym panelu ustawień znajdziemy opcję: Pokaż szczegółowe informacje podczas. Zaznaczamy kompilacji oraz wgrywania. Teraz powinniśmy powiększyć okno naszego sketcha, bo komunikatów będzie sporo. Kompilujemy projekt i od razu widzimy (długi) rezultat:
Właściwie wszystko już wiemy (o ile znamy gcc)… Ale może warto chwilę poświęcić na omówienie tego co zobaczyliśmy. Poniżej mój log z kompilacji:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware "C:\Program Files (x86)\Arduino\hardware" -hardware "C:\Users\Piotrek\AppData\Local\Arduino15\packages" -tools "C:\Program Files (x86)\Arduino\tools-builder" -tools "C:\Program Files (x86)\Arduino\hardware\tools\avr" -tools "C:\Users\Piotrek\AppData\Local\Arduino15\packages" -built-in-libraries "C:\Program Files (x86)\Arduino\libraries" -libraries "C:\Users\Piotrek\Documents\Arduino\libraries" -fqbn=arduino:avr:uno -ide-version=10610 -build-path "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp" -warnings=none -prefs=build.warn_data_percentage=75 -verbose "C:\Users\Piotrek\Documents\Arduino\inside\test1\test1.ino" C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware "C:\Program Files (x86)\Arduino\hardware" -hardware "C:\Users\Piotrek\AppData\Local\Arduino15\packages" -tools "C:\Program Files (x86)\Arduino\tools-builder" -tools "C:\Program Files (x86)\Arduino\hardware\tools\avr" -tools "C:\Users\Piotrek\AppData\Local\Arduino15\packages" -built-in-libraries "C:\Program Files (x86)\Arduino\libraries" -libraries "C:\Users\Piotrek\Documents\Arduino\libraries" -fqbn=arduino:avr:uno -ide-version=10610 -build-path "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp" -warnings=none -prefs=build.warn_data_percentage=75 -verbose "C:\Users\Piotrek\Documents\Arduino\inside\test1\test1.ino" Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr Detecting libraries used... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp" -o "nul" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp" -o "nul" Generating function prototypes... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\preproc\ctags_target_for_gcc_minus_e.cpp" "C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino10/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\preproc\ctags_target_for_gcc_minus_e.cpp" Kompilowanie szkicu... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp.o" Compiling libraries... Compiling core... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -x assembler-with-cpp -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_pulse.S" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_pulse.S.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\WInterrupts.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WInterrupts.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\hooks.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\hooks.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_analog.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_analog.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_digital.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_digital.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_pulse.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_pulse.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring_shift.c" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_shift.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\CDC.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\CDC.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial0.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial0.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial1.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial1.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial2.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial2.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HardwareSerial3.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial3.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\IPAddress.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\IPAddress.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\PluggableUSB.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\PluggableUSB.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Print.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Print.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Stream.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Tone.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Tone.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\USBCore.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\USBCore.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\WMath.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WMath.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\WString.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WString.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\abi.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\abi.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\main.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\new.cpp" -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\new.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_pulse.S.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WInterrupts.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\hooks.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_analog.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_digital.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_pulse.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\wiring_shift.c.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\CDC.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial0.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial1.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial2.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\HardwareSerial3.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\IPAddress.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\PluggableUSB.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Print.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Stream.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\Tone.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\USBCore.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WMath.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\WString.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\abi.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\main.cpp.o" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc-ar" rcs "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\core.a" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\core\new.cpp.o" Linking everything together... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc" -w -Os -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.elf" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp.o" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/core\core.a" "-LC:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp" -lm "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.elf" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.eep" "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-objcopy" -O ihex -R .eeprom "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.elf" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.hex" Szkic używa 928 bajtów (2%) pamięci programu. Maksimum to 32 256 bajtów. Globalne zmienne używają 9 bajtów (0%) dynamicznej pamięci, pozostawiając 2 039 bajtów dla lokalnych zmiennych. Maksimum to 2 048 bajtów. |
Jak przebiega kompilacja kodu?
Pomijając kilka pierwszych linijek widzimy te najciekawszą:
1 2 |
Detecting libraries used... "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10610 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp\sketch\test1.ino.cpp" -o "nul" |
Zobaczmy zawartość katalogu, do którego się odwołuje to polecenie, czyli:
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin
Okazuje się, że znajdziemy tam najzwyklejszy kompilator gcc (w wersji dla AVR oczywiście). Nie jest to tajemniczy kompilator Arduino, ale normalny kompilator C/C++.
Jeśli pochodzimy trochę po katalogach, to w „okolicy” znajdziemy tam cały kompilator gcc, biblioteki standardowe C oraz avrdude, czyli program do programowania przez STK500 oraz bootloader.
Jak przebiega uruchomienie kompilatora?
Wiemy już, że kompilator jest standardowy, zobaczmy więc jak jest uruchamiany. Jako jeden z parametrów wywołania g++ jest prawie nasz projekt (test1.ino.cpp zamiast test1).
Zobaczmy co zawiera katalog:
C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp
Okazuje się, że to jest lokalizacja, w której Arduino IDE przechowuje wszystkie pliki używane podczas kompilacji. Nasz oryginalny projekt to jeden plik: test1.ino. Z niego generowana jest zawartość widocznego katalogu.
Co ciekawe plik test1.ino.hex, to gotowy obraz dla avrdude – znowu standardowy, bez magii (niestety). W podkatalogu sketch znajdziemy plik, który jest wykorzystywany przez kompilator, czyli test1.ino.cpp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <Arduino.h> #line 1 "C:\\Users\\Piotrek\\Documents\\Arduino\\inside\\test1\\test1.ino" #line 1 "C:\\Users\\Piotrek\\Documents\\Arduino\\inside\\test1\\test1.ino" #line 1 "C:\\Users\\Piotrek\\Documents\\Arduino\\inside\\test1\\test1.ino" void setup(); #line 5 "C:\\Users\\Piotrek\\Documents\\Arduino\\inside\\test1\\test1.ino" void loop(); #line 1 "C:\\Users\\Piotrek\\Documents\\Arduino\\inside\\test1\\test1.ino" void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW delay(1000); } |
Łatwo rozpoznać, że jest to nasz program z dodanymi kilkoma linijkami na początku. Najważniejsze jest #include<Arduino.h>. To właśnie dzięki tej linii mamy dostępne mnóstwo funkcji w programie.
Nie jest to nic "wbudowanego" w Arduino,
jest to najzwyklejszy plik nagłówkowy.
Tutaj skrywa się cała "magia" Arduino
Czas poszukać pliku Arduino.h i sprawdzić co w nim znajdziemy. Linijka wywołująca g++ zawiera ścieżki do plików nagłówkowych (parametr -I). W moim przypadku, pliki nagłówkowe znajdziemy w katalogu: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino
Zawartość tego pliku widoczna jest poniżej:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
/* Arduino.h - Main include file for the Arduino SDK Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Arduino_h #define Arduino_h #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <math.h> #include <avr/pgmspace.h> #include <avr/io.h> #include <avr/interrupt.h> #include "binary.h" #ifdef __cplusplus extern "C"{ #endif void yield(void); #define HIGH 0x1 #define LOW 0x0 #define INPUT 0x0 #define OUTPUT 0x1 #define INPUT_PULLUP 0x2 #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 #define TWO_PI 6.283185307179586476925286766559 #define DEG_TO_RAD 0.017453292519943295769236907684886 #define RAD_TO_DEG 57.295779513082320876798154814105 #define EULER 2.718281828459045235360287471352 #define SERIAL 0x0 #define DISPLAY 0x1 #define LSBFIRST 0 #define MSBFIRST 1 #define CHANGE 1 #define FALLING 2 #define RISING 3 #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #define DEFAULT 0 #define EXTERNAL 1 #define INTERNAL 2 #else #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) #define INTERNAL1V1 2 #define INTERNAL2V56 3 #else #define INTERNAL 3 #endif #define DEFAULT 1 #define EXTERNAL 0 #endif // undefine stdlib's abs if encountered #ifdef abs #undef abs #endif #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define abs(x) ((x)>0?(x):-(x)) #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define radians(deg) ((deg)*DEG_TO_RAD) #define degrees(rad) ((rad)*RAD_TO_DEG) #define sq(x) ((x)*(x)) #define interrupts() sei() #define noInterrupts() cli() #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) #define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) #define bitRead(value, bit) (((value) >> (bit)) & 0x01) #define bitSet(value, bit) ((value) |= (1UL << (bit))) #define bitClear(value, bit) ((value) &= ~(1UL << (bit))) #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) // avr-libc defines _NOP() since 1.6.2 #ifndef _NOP #define _NOP() do { __asm__ volatile ("nop"); } while (0) #endif typedef unsigned int word; #define bit(b) (1UL << (b)) typedef bool boolean; typedef uint8_t byte; void init(void); void initVariant(void); int atexit(void (*func)()) __attribute__((weak)); void pinMode(uint8_t, uint8_t); void digitalWrite(uint8_t, uint8_t); int digitalRead(uint8_t); int analogRead(uint8_t); void analogReference(uint8_t mode); void analogWrite(uint8_t, int); unsigned long millis(void); unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t, void (*)(void), int mode); void detachInterrupt(uint8_t); void setup(void); void loop(void); // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. #define analogInPinToBit( :P) ( :P) // On the ATmega1280, the addresses of some of the port registers are // greater than 255, so we can't store them in uint8_t's. extern const uint16_t PROGMEM port_to_mode_PGM[]; extern const uint16_t PROGMEM port_to_input_PGM[]; extern const uint16_t PROGMEM port_to_output_PGM[]; extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. // // These perform slightly better as macros compared to inline functions // #define digitalPinToPort( :P) ( pgm_read_byte( digital_pin_to_port_PGM + ( :P) ) ) #define digitalPinToBitMask( :P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + ( :P) ) ) #define digitalPinToTimer( :P) ( pgm_read_byte( digital_pin_to_timer_PGM + ( :P) ) ) #define analogInPinToBit( :P) ( :P) #define portOutputRegister( :P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + ( :P))) ) #define portInputRegister( :P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + ( :P))) ) #define portModeRegister( :P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + ( :P))) ) #define NOT_A_PIN 0 #define NOT_A_PORT 0 #define NOT_AN_INTERRUPT -1 #ifdef ARDUINO_MAIN #define PA 1 #define PB 2 #define PC 3 #define PD 4 #define PE 5 #define PF 6 #define PG 7 #define PH 8 #define PJ 10 #define PK 11 #define PL 12 #endif #define NOT_ON_TIMER 0 #define TIMER0A 1 #define TIMER0B 2 #define TIMER1A 3 #define TIMER1B 4 #define TIMER1C 5 #define TIMER2 6 #define TIMER2A 7 #define TIMER2B 8 #define TIMER3A 9 #define TIMER3B 10 #define TIMER3C 11 #define TIMER4A 12 #define TIMER4B 13 #define TIMER4C 14 #define TIMER4D 15 #define TIMER5A 16 #define TIMER5B 17 #define TIMER5C 18 #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus #include "WCharacter.h" #include "WString.h" #include "HardwareSerial.h" #include "USBAPI.h" #if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL) #error "Targets with both UART0 and CDC serial not supported" #endif uint16_t makeWord(uint16_t w); uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); // WMath prototypes long random(long); long random(long, long); void randomSeed(unsigned long); long map(long, long, long, long, long); #endif #include "pins_arduino.h" #endif |
Jest tam wszystko co często traktowane jest jako "wbudowane", przykładowo:
1 2 3 4 5 6 |
unsigned long millis(void); unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); |
Jak Arduino obsługuje liczby binarne?
Mnie najbardziej rozbroił plik „binary.h”, który jest włączany przez Arduino.h. Naiwnie uwierzyłem, że gcc dla AVR obsługuje liczby binarne, a tutaj taka niespodzianka:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#define B0 0 #define B00 0 #define B000 0 #define B0000 0 #define B00000 0 #define B000000 0 #define B0000000 0 #define B00000000 0 #define B1 1 #define B01 1 #define B001 1 #define B0001 1 #define B00001 1 #define B000001 1 #define B0000001 1 #define B00000001 1 #define B10 2 #define B010 2 #define B0010 2 #define B00010 2 #define B000010 2 #define B0000010 2 #define B00000010 2 itd. (razem 534 linie) |
Inna sprawa, że to świetna sztuczka, można wykorzystać w projektach, niezwiązanych z Arduino.
Wspomniany katalog jest bardzo interesujący. Znajdziemy w nim sporo funkcji i klas używanych w programach dla Arduino. Przykładowo WString zawiera klasę String używaną do manipulacji napisami, wiring.c dostarcza funkcji związanych z opóźnieniami i czasem (delay, milis), a wiring_digital.c zawiera funkcje manipulujące pinami (pinMode, digitalWrite, digitalRead).
Plik main.cpp - wywołanie setup() oraz loop()
Jednak najciekawszy (przynajmniej dla mnie) jest plik main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <Arduino.h> // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } |
W nim znajduje się funkcja main! Jak łatwo zauważyć, wywołuje ona nasze funkcje setup() oraz loop() - tutaj jest cała magia Arduino. Widać że jest to zwykły program w C (albo raczej C++), tylko nieco dziwnie skonfigurowany. Na koniec możemy wgrać program na płytkę i zobaczyć:
Znowu nie ma magii – zwykłe wywołanie avrdude:
1 |
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM8 -b115200 -D -Uflash:w:C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp/test1.ino.hex:i |
Podsumowując
Arduino, to po prostu gcc oraz avrdude wraz z bibliotekami oraz środowiskiem do programowania. Można je lubić lub nie – na pewno jest łatwe do zainstalowania i użycia dla początkujących. Co więcej jego kod źródłowy jest dostępny (na githubie), a samo środowisko jest pisane przy wykorzystaniu Eclipse…
Teraz wiemy jak Arduino przygotowuje swoją magię. Nie ma więc innego języka programowania, jest to standardowy C/C++ oraz standardowy kompilator gcc. Jeśli tylko chcemy, możemy skompilować program „ręcznie”, albo wykorzystać gcc i biblioteki w innym środowisku, np. Eclipse lub make.
Najważniejszy jest jednak następujący wniosek: jeśli uczymy się programować Arduino, możemy spokojnie chwalić się, że znamy C++. Nie ma żadnej różnicy między Arduino, a C/C++. To tylko inna wersja środowiska programistycznego.
Autor: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański
Nawigacja kursu
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
arduino, avr, C, gcc, programowanie
Trwa ładowanie komentarzy...