SMALL - espritmodel.com SMALL - Telemetry SMALL - Radio
Reply
Thread Tools
Old Oct 16, 2014, 01:48 AM
Registered User
Germany, Berlin
Joined Sep 2014
89 Posts
Mini-HowTo
How to better read / understand multiwii sketches

Hi everybody!

Maybe you tryed - like me - to understand the source code of the MiltiWii. When i tryed it first, i was drunk of the mass of #ifdef 's, and in the Arduino "IDE", i could hardly find out which "#define" had an effect, depending on my "config.h" settings.

Further, i could see a function like "initOutputs()", but no idea and NO TOOL in the Adruine "IDE" to see where it is defined?

Asking in the MicroMWC Thread, Cesco told me that he stripped a version "manually" just to understand how it works:

http://www.rcgroups.com/forums/showp...postcount=1265

Lazy as i am, i remember some decades ago when i had to do programs in C, that where was a "preprocessor" - so why not let this software do the work, with less errors that i would do manually?

http://gcc.gnu.org/onlinedocs/gcc/Pr...r-Options.html

When looking at the verbose output of the Arduino, i changed some options. Here's what i did, using the latest "luca's" sketch:

0) I love it! install the geany editor - very powerful and simple text editor!

1) settings: In Arduino, set verbose compile output and in the preferences.txt: change the line "preproc.save_build_files=true" (default is false) When you alter this preferences file, Arduino must be closed. Then start Adruino again and compile the sketch (no need to upload)

2) copy the output messages of arduino and remove all lines that do not start with "avr-g++". It should look now similar to this:

Code:
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Output.cpp -o /tmp/build1312962392896202607.tmp/Output.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/EEPROM.cpp -o /tmp/build1312962392896202607.tmp/EEPROM.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/RX.cpp -o /tmp/build1312962392896202607.tmp/RX.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Serial.cpp -o /tmp/build1312962392896202607.tmp/Serial.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/LCD.cpp -o /tmp/build1312962392896202607.tmp/LCD.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/MultiWii.cpp -o /tmp/build1312962392896202607.tmp/MultiWii.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Sensors.cpp -o /tmp/build1312962392896202607.tmp/Sensors.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/GPS.cpp -o /tmp/build1312962392896202607.tmp/GPS.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/IMU.cpp -o /tmp/build1312962392896202607.tmp/IMU.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Protocol.cpp -o /tmp/build1312962392896202607.tmp/Protocol.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/MultiWii_2_3_Luca_base.cpp -o /tmp/build1312962392896202607.tmp/MultiWii_2_3_Luca_base.cpp.o 

	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/CDC.cpp -o /tmp/build1312962392896202607.tmp/CDC.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/main.cpp -o /tmp/build1312962392896202607.tmp/main.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/WString.cpp -o /tmp/build1312962392896202607.tmp/WString.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/Print.cpp -o /tmp/build1312962392896202607.tmp/Print.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/new.cpp -o /tmp/build1312962392896202607.tmp/new.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/Stream.cpp -o /tmp/build1312962392896202607.tmp/Stream.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/USBCore.cpp -o /tmp/build1312962392896202607.tmp/USBCore.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/IPAddress.cpp -o /tmp/build1312962392896202607.tmp/IPAddress.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/WMath.cpp -o /tmp/build1312962392896202607.tmp/WMath.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/HID.cpp -o /tmp/build1312962392896202607.tmp/HID.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/HardwareSerial.cpp -o /tmp/build1312962392896202607.tmp/HardwareSerial.cpp.o 
	avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /usr/share/arduino/hardware/arduino/cores/arduino/Tone.cpp -o /tmp/build1312962392896202607.tmp/Tone.cpp.o
3) because i was only interested in the multiwii staff and not in the Arudino staff, i deleted the last 12 lines (that refer to the arduino libs etc). Then i changed the preprocessor option -c to -E -CC - do not compile but stop after preprocessing and keep all comments. If you like it different, play with the options! Then, to be have a syntax highlighting in geany, i altered the output file extension to ".l.cpp" instead of ".o". And finally, to be able to paste all into a terminal window, i concated the instructions by "&&" and the lines by "\" - so it looks now like this:

Code:
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Output.cpp -o /tmp/build1312962392896202607.tmp/Output.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/EEPROM.cpp -o /tmp/build1312962392896202607.tmp/EEPROM.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/RX.cpp -o /tmp/build1312962392896202607.tmp/RX.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Serial.cpp -o /tmp/build1312962392896202607.tmp/Serial.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/LCD.cpp -o /tmp/build1312962392896202607.tmp/LCD.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/MultiWii.cpp -o /tmp/build1312962392896202607.tmp/MultiWii.cpp.l.cpp && \  
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Sensors.cpp -o /tmp/build1312962392896202607.tmp/Sensors.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/GPS.cpp -o /tmp/build1312962392896202607.tmp/GPS.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/IMU.cpp -o /tmp/build1312962392896202607.tmp/IMU.cpp.l.cpp && \ 
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/Protocol.cpp -o /tmp/build1312962392896202607.tmp/Protocol.cpp.l.cpp && \  
	avr-g++ -E -CC -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard /tmp/build1312962392896202607.tmp/MultiWii_2_3_Luca_base.cpp -o /tmp/build1312962392896202607.tmp/MultiWii_2_3_Luca_base.cpp.l.cpp
(Part 2 will follow..)
loeten is offline Find More Posts by loeten
Reply With Quote
Sign up now
to remove ads between posts
Old Oct 16, 2014, 02:21 AM
Registered User
Germany, Berlin
Joined Sep 2014
89 Posts
4) paste all the lines from step 3) into a terminal and run it. it's very quick!

5) Now, open the folder where the temp files are in (you see it in the lines, in my case it was "/tmp/build1312962392896202607.tmp". Sort by file type, select all .cpp files, right click and choose "open in geany" (Maybe in the windows world, Notepad++ is a good alternative, or eclipse as multiplatform java tool).

So you see the original source files and the preprocessed source side by side, with the same base file name and .cpp vs .l.cpp ending. in the .l.cpp (preprocessor output, you can even see from what source line the instruction came (ok, there are also some more line breakes and spaces than needed). But for me it was now easy to see, what happens.

I hope it helps somebody else in understanding this cool little peace of software!

As you can see in the screenshot - you see "what happened" while resolving all the #ifdefs, you can see where the line comes from (if you want to see the original - it's the file in the tab left beside), you can navigate to symbols, classes and funktion names in the left, and you can in the geany menu "search in files" (of the current folder) for initOutput in example - and see the results below + also navigate there by clicking.

Further ideas and tips - very welcome. If somebody wants to do the steps above multiple times, maybe it's worth to do a shell script for it. Or maybe, there is a way that i did not see and i re-invented the wheel.. :-)
loeten is offline Find More Posts by loeten
Reply With Quote
Old Oct 16, 2014, 04:15 AM
Registered User
HELModels's Avatar
Joined Aug 2003
2,636 Posts
That's cool. I've done the manual way to get at some of the functions. I was able to borrow the PPM Rx stuff for another program. I might have to try your way and see if I can understand it even better.
HELModels is online now Find More Posts by HELModels
Reply With Quote
Old Oct 16, 2014, 04:55 AM
Registered User
Germany, Berlin
Joined Sep 2014
89 Posts
Thank you! And by the way - the principle should be possible using Windows as well, but then the lines from 3) should go into a batch file, without "&& \" at the end.
loeten is offline Find More Posts by loeten
Reply With Quote
Old Oct 16, 2014, 06:01 AM
Registered User
United Kingdom, England, Herefordshire
Joined Oct 2012
238 Posts
Another (way easier) way is to install Visual Studio, then install Visual Micro (plugin for VS) which allows you to open Arduion sketches, compile and upload within VS! You can right click definitions or functions, and 'goto definition' or even hover over the def and it will tell you what the def is set to! Also any def that is NOT defined comes up as grey and in italics, so you can EASILY see what is defined and what is not! Like if there are many 'ifdef then else' you can see exactly which one will get called

EDIT: Obviously windows only, but VS is a good IDE in my opinion purely for the intellisense thing
geebles is offline Find More Posts by geebles
Reply With Quote
Old Oct 16, 2014, 07:27 AM
proud to be orange!
benedikt's Avatar
Australia, NSW, Avoca Beach
Joined Jul 2013
1,675 Posts
Way over my head what going on here..
But I hope something awesome is coming out of this
Subscribed.
benedikt is offline Find More Posts by benedikt
RCG Plus Member
Old Oct 16, 2014, 08:42 AM
Team WarpSquad
United States, PA, Doylestown
Joined Jan 2014
2,613 Posts
Nice, I'll definitely play with this.
I have been able to find where #defines are used with Notepad++ using the "Search/Find in Files" feature. This will search all files within a folder. You still need to go through them and figure out which #ifdef is being used.
waltr is online now Find More Posts by waltr
Reply With Quote
Old Oct 16, 2014, 08:55 AM
Registered User
United States, CO, Colorado Springs
Joined Oct 2014
23 Posts
There is a lot of info about how to use the Eclipse IDE which is an open source non-microsoft integrated development environment. Eclipse allows you to follow code to where it was defined or where it is referenced.
http://playground.arduino.cc/Code/Eclipse
Eclipse is widely used in the global development community. After i gain basic understanding and general use of multiWii i plan to dive into the code a little deeper.
kwilder is offline Find More Posts by kwilder
Reply With Quote
Old Oct 16, 2014, 09:09 AM
Registered User
Germany, Berlin
Joined Sep 2014
89 Posts
Quote:
Originally Posted by kwilder View Post
There is a lot of info about how to use the Eclipse IDE which is an open source non-microsoft integrated development environment. Eclipse allows you to follow code to where it was defined or where it is referenced.
http://playground.arduino.cc/Code/Eclipse
Eclipse is widely used in the global development community. After i gain basic understanding and general use of multiWii i plan to dive into the code a little deeper.
I know Eclipse from the past and also mentioned it above. Does it also resolve the #define's as Visual studio or the preprocessor? Visual Studio is a good idea, but i dont like to go back to Windows just for this.. :-)
loeten is offline Find More Posts by loeten
Last edited by loeten; Oct 16, 2014 at 12:31 PM.
Reply With Quote
Old Oct 22, 2014, 07:17 AM
Registered User
United States, CO, Colorado Springs
Joined Oct 2014
23 Posts
loeten - I have not tried Eclipse with the multiWii code yet. Focusing on getting my first multiWii copter in the air first. Then later i plan to study the code.
kwilder is offline Find More Posts by kwilder
Reply With Quote
Reply


Thread Tools

Similar Threads
Category Thread Thread Starter Forum Replies Last Post
Discussion understanding arming etc. in MultiWii GUI loeten Multirotor Electronics 3 Sep 25, 2014 08:10 AM
Help! ZMR MultiWii Lite - what sketch to use? NK55 Multirotor Talk 5 May 03, 2014 11:25 PM
Discussion How do I read from MultiWii board? ebourlet Multirotor Electronics 1 Mar 13, 2013 12:07 AM
Help! cant upload sketch to crius multiwii se v0.2 ash123 Multirotor Electronics 2 Jan 16, 2013 08:25 PM
Discussion HK MultiWii SE V2.0 Flight Controller w/FTDI Sketch Judar Multirotor Electronics 7 Oct 15, 2012 12:56 PM