2014年6月20日 星期五

BBB Serial Debug

Just a quick Note
  • J1 = GND (Ground)
  • J2 = CTS
  • J3 = VCC (5V)
  • J4 = RXD (Receive Data)
  • J5 = TXD (Transmit Data)
  • J6 = RTS
And its pin map

2014年6月19日 星期四

Compiling uROSnode

uROSnode
We can find it on Github: https://github.com/openrobots-dev/uROSnode
It is a great work for MCU can run ROS.
https://dl.dropboxusercontent.com/u/2771793/uros/doc/html/pag_demos.html
One great explainition about this project: pdf
ROSCon: http://vimeo.com/66970254

Problem 1:
Compiling ./src/urosUser.c
In file included from ../../include/urosUser.h:45:0,
                 from ./src/urosUser.c:42:
./src/urosUser.c: In function 'urosUserParamUpdate':
./src/urosUser.c:353:21: error: 'UrosRpcParam' has no member named 'class'
     urosError(paramp->class != UROS_RPCP_INT, return UROS_ERR_BADPARAM,
                     ^
../../include/urosBase.h:323:50: note: in definition of macro 'urosError'
 #  define urosError(when, action, msgargs) { if (when) { action; } }
                                                  ^
./src/urosUser.c:368:21: error: 'UrosRpcParam' has no member named 'class'
     urosError(paramp->class != UROS_RPCP_INT, return UROS_ERR_BADPARAM,
                     ^
../../include/urosBase.h:323:50: note: in definition of macro 'urosError'
 #  define urosError(when, action, msgargs) { if (when) { action; } }
                                                  ^
./src/urosUser.c:383:21: error: 'UrosRpcParam' has no member named 'class'
     urosError(paramp->class != UROS_RPCP_INT, return UROS_ERR_BADPARAM,
                     ^
../../include/urosBase.h:323:50: note: in definition of macro 'urosError'
 #  define urosError(when, action, msgargs) { if (when) { action; } }
                                                  ^
make: *** [build/obj/urosUser.o] Error 1
Fix:
Find the struct in uROSnode/include/urosRpcCall.h

typedef struct UrosRpcParam {

  uros_rpcparamclass_t      pclass;      /**< @brief Parameter pclass.*/

  union {

    UrosString              string;     /**< @brief XMLRPC string.*/

    int32_t                 int32;      /**< @brief XMLRPC int/i4.*/

    uros_bool_t             boolean;    /**< @brief XMLRPC boolean.*/

    double                  real;       /**< @brief XMLRPC double.*/

    UrosString              base64;     /**< @brief XMLRPC base64.*/

    void                    *mapp;      /**< @brief XMLRPC struct (map pointer).*/ /* TODO */

    struct UrosRpcParamList *listp;     /**< @brief XMLRPC array (list pointer).*/

  }                         value;      /**< @brief Parameter value.*/

} UrosRpcParam;


Then, just change the variable name from class to pclass. The error seems caused by typo.


Problem 2:
/src/lld/lwip/uros_lld_conn.c:784: undefined reference to `netconn_set_sendtimeout'

At first, I think it seems the lwip version caused error.
Change from 1.4.0 to 1.4.1
However, problem still exist.
/../../ext/lwip/src/api/api_lib.c:627: undefined reference to `sys_now'
build/obj/api_msg.o: In function `do_writemore':
/home/kv/rosnode/ChibiOS_2.5.1/demos/uROSnode/demos/turtlesim-chibios+lwip/../../../../ext/lwip/src/api/api_msg.c:1228: undefined reference to `sys_now'
collect2: error: ld returned 1 exit status
make: *** [build/turtlesim.elf] Error 1
Fix:
Then i just do the dirty thing. That I comment sys_now in 
lwip/src/api/api_msg.c
and 
lwip/src/api/api_lib.c
cause they have no instance.

Finally, the compilation is d
one.

st-flash write build/turtlesim.bin 0x08000000
2014-06-19T16:29:51 INFO src/stlink-common.c: Starting verification of write complete
2014-06-19T16:29:54 INFO src/stlink-common.c: Flash written and verified! jolly good!

But it doesn't Run! Obviously, we have different hardware module with their. 



The difficulty then will be porting the peripheral to the STM32F407 which we using Discovery.

I think porting this could be a great help to my robot!

2014年6月18日 星期三

DC Motor Speed PID Control with Arduino

It is a new MechLab for NCKU ME next semester, a PID controller!
Hardware:





Source Code on Github: https://github.com/kvzhao/ME-PIDLab

The crucial part of the PID code is listed below
void loop()
{
    // Run a period to estimate more precise speed
    Motor.Tick();
    // Run for one Second
    delay(SamplingTime);
    Motor.Tock();

    // Read rotation speed from Encoder
    Input = Motor.getSpeedRPS();

    // PID Compute
    PID_Controller.Compute();
    if ((Output-prevOutput) >= oscGap) {
      //Output = prevOutput;
    }
    Motor.setSpeed(Output);
    prevOutput = Output;
    // Show Data
    /*
    Serial.print("Input: ");
    Serial.println(Input);
    Serial.print("Setpoint: "); 
    Serial.println(Setpoint);    
    Serial.print("Error: ");
    Serial.println(error);
    Serial.print("Output: "); 
    Serial.println(Output);*/
    Serial.println(error);
    // wait a little while
    delay(5);
}


My first test result (with KP=98, KI=8, PD=5)
There is almost no steady state error, however overshoot happens.
Next step is to tune the parameters and control the motor smoothly!

Some useful references



2014年6月17日 星期二

2014年2月13日 星期四

Good articles about Arduino and IMU

Kalman filter is the one of the filter, or signal processing technique that lures me.

I wanna make a small system (via Arduino) to implement it and act as the lab material of embedded system tutorial.

Some useful websites and source code listing here :


Besides, here is the Arduino PID lib.

Great article : Faster analogRead()