Sunday, August 6, 2017

Keeping Your IOT Drone Under 250 Grams

Nothing requiring government registration can become mass consumer product

So are drones. Helicopters offers better hover duration than quads. But, Blade 200S is moving away from the 250 gram realm of Blade 200SRX. Luckily there is a quick fix. Use Blade 200SRX and common quad parts on top of the 200S body. And I reduce it to 236 grams. The weight reduction is 1.7 grams from common quad components tail section, 1.6 grams from home-made ESC-BEC, 3.6 grams from Xtreme 8-degree blades, 3.4 grams from EC2 2mm banana plugs, 2.3 grams from Microheli main shaft, and 2.1 grams from removing battery strap and jacket. The 200S body gains 2.3 grams . CC3D Revo Flight board with FS-A8S receiver make the electronics reduces 0.2 grams weight from stock AR636H +AS3X .
246.6 - 1.6 - 3.4 - 3.6 - 2.3 - 1.7 - 2.1 - 0.2 + 2.3 = 234.0
Comparison to stock components follow,

256.8 - 22.8(stool) = 234

202.1 + 68.9(battery) - 24.4(stool) = 246.6

Breakdowns of the weight loss

The tail weight is 2.6(fin+screws) + 17.5(motor+mount+wires+screw+prop) + 3.8(boom) + 0.7(female part of 2mm EC2 banana plugs) = 24.6 . The stock tail weight is 1.9 (fin+screws) + 17.9 (motor+mount+wires+prop) + 2.9(boom) + 2.5(support booms) + 0.4 (horizontal fin) + 0.7 (male servo plug not pictured) = 26.3 .
The kit has a standalone shaft tightening bolt (upper left corner). But the kid does 
not need prop holder because the push configuration presses prop down.
Stock does not have separate tightening bolt.

Second layer breakdown of the motor+bracket+wires+screw+prop in the tail section follows.

Prop is 0.2 grams lighter in my modification. Motor is also 0.2 grams lighter then stock.

ESC without main banana plugs is 16 - 0.7 = 15.3 . Stock ESC without main banana plugs is 19.4 - 2.5 = 16.9 .

Xtreme blade has hollowed body underneath the decal skin.

EC2 2mm banana plugs is less than 1/3 the weight of stock 3.5mm banana plugs

Carbon fiber main shaft is less than half of stock steel shaft.

Battery strap and jacket removed from stock configuration

New 200S's body gains some weight

Here the retail AR636 is 11.5 . CC3D(8.8)+A8X(2.5) is 11.3 .

. And CC3D settings follow,

. The bug in CC3D prevents me from using vehicle type "FP" fixed-pitch. If I select FP, INPUT in the flight data tab is put in orange, vehicle not flyable.

Sunday, July 16, 2017

C Programming Raspberry Pi MQTT Drone PWM

Drones commonly require real time programming because a split second control delay of a tail rotor can mean 180 degrees difference of a helicopter's heading.  For this reason, flight controller programming is often done with C language on a micro controller, where control logic can be optimized on a per-CPU-instruction basis.

However, a new trend has emerged to use Raspberry Pi Zero as a robotic controller to take advantage of the ubiquitous Linux programming, which the OS hides the underlying custom circuitry of micro controllers and presents the abstract programming interface to the programmers so that a program can be portable between different hardware systems. Adafruit has many tutorials focus on the Python library for the I2C devices. But, again, few resources provide the comprehensive view of the requirement of real time C programming. So, as soon as I found a hint of a C library controlling I2C servos, I have to jump in and test drive its performance.

The solution is . Steps I took:
  1. "Burn" SD Card with 2017-06-21-raspbian-jessie-lite.img , which is public downloadable from raspberrypi official site. After first powering on with the "burned" SD, wait for the disk expansion to finish in a few minutes while green LED light busy flashes.
  2. Wire up as the following diagram, 
  3. The usual IP connectivity chores. First thing is to get UART access through USB-FTDI adapter. Raspberry Pi Kernel side needs "enable_uart=1" in /boot/config.txt . To do so, insert the SD in to my PC to mount it .  
  4.  Then try to get IP access. Comment out the wlan entries in /etc/network/interfaces , and replaces it with my AP access credential,
    auto wlan0
    iface wlan0 inet static
    wpa-ssid "pc36000"
    wpa-psk "A...."
    Then, systemctl enable ssh , and reboot. Once IP SSH access is successful, apt install vim , and comment out the "enable_uart=1" .
  5. apt-get install git-core
    git clone git://
    cd wiringPi/
  6. git clone
    cd pca9685/src/
    sudo make install
  7. cd; mkdir mqtt-pizero
    cd mqtt-pizero
  8. vim servo-check.c ; The content follows,
    #include <pca9685.h>
    #include <stdio.h>

    int calcTicks(float impulseMs, int hertz)
    float cycleMs = 1000.0f / hertz;
    return (int)(4096 * impulseMs / cycleMs + 0.5f);

    int main()
    int fd = pca9685Setup(300, 0x40, 50);

    float millis = 1.5;
    int tick = calcTicks(millis, 50);
    pwmWrite(300, tick);

    while (1)
    millis = 1.8;
    tick = calcTicks(millis, 50);
    pwmWrite(300, tick);

    millis = 1.2;
    tick = calcTicks(millis, 50);
    pwmWrite(300, tick);
  9. gcc servo-check.c -o servo-check -l wiringPiPca9685 -l wiringPi
  10. apt install i2c-tools
  11. sudo vim /boot/config.txt ;  uncomment the following line,
  12. sudo vim /etc/modules; content follows,
  13. sudo vim /etc/modules-load.d/modules.conf; content follows,
  14. sudo sync ; sudo reboot
  15. Once rebooted, check i2c device is at 0x40 by gpio readall ; then cd mqtt-pizero/ ; ./servo-check

Friday, May 19, 2017

Inbound And Outbound Dialings Are "Institutional"

Why are there inbound and outbound boundaries with phones but not with Facebook/Google/Apple voice chats? Can we answer that question by looking at the smallest bits and pieces ourselves? I think so. But, what is the implication behind all these?

OK. In my diagram above, when lines, connections touch, it means they are associated. The purple inbound dialings do not touch any trunk lines, which means the inbound dialings are not associated with any particular trunk line. The orange PBX outbound dialing does not touch any phone line and is not associated with any phone protocol. The PBX outbound dialing, however, does touch SIP trunk line, which means it only goes out on the SIP trunk and not H323 protocol. So, all that means is that an inbound dialing does not care what the outbound trunk or protocol will be; an outbound dialing does not care what the inbound phone or protocol is. This is the essence of the PSTN call leg and the essence of VOIP.
For the green VOIP signal dash lines, the corresponding configs are in pjsip.aor.conf ,



, and in ooh323.conf ,
port = 1720
. The purple inbound dialings are in extensions_additional.conf ,
exten => 18001231101,1,Set(__DIRECTION=INBOUND)
exten => 18001231101,n(dest-ext),Goto(from-did-direct,101,1)

exten => 18001231102,1,Set(__DIRECTION=INBOUND)
exten => 18001231102,n(dest-ext),Goto(from-did-direct,102,1)

exten => 18004561203,1,Set(__DIRECTION=INBOUND)
exten => 18004561203,n(dest-ext),Goto(from-did-direct,203,1)
, and outbound dialings are also in extensions_additional.conf
[outrt-1] ; siptrunk
exten => _1800321XXXX,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _1800321XXXX,n,Macro(dialout-trunk,2,${EXTEN:7},,off)

[outrt-2] ; h323trunk
exten => _1800654XXXX,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _1800654XXXX,n,Macro(dialout-trunk,1,${EXTEN:7},,off)

. The FreePBX GUI generates the entire extensions_additional.conf and pjsip_aor.conf . ooh323.conf is entirely manually created. All configurations are downloadable here, .
The GUI dialogs are

The voice-vlan enabled router configuration is as .
The CUCM GUI screenshots are 

So, a call leg becomes a proxy in the TCP/IP/HTTP world so that the destination and source phones do not know the IP address of each other. The very definition of protocol proxy. It provides some isolation("does not care") of parts of the network while requiring the border routers to have the insights into the protocol. Speaking of proxy, do you know that this very page you are viewing is a proxy'ed page when you are at, which is . The true IP address of the web server is google's blogger web server IP address. That will be yet another posting about the Apache configuration that made the proxy.