Sunday, September 27, 2020

Controlling DFrobot Gravity I2C RGB LCD using Micro:bit

 Idea

Control the LCD using Microbit 

Implementation

Well, I just ported Dfroboth Arduino code to Microbit blocks. An Example Video 
Or

Microbit Blocks are here and an example is below





Note that there are no error handling in the code so use carefully




AWD Lego Custom made Car using Raspberry Pi - Part 1

 Idea

Use Raspberry Pi to control this custom made car model. 

Implementation

Bill of Materials

Hardware

  1. Raspberry Pi Zero W
  2. Raspberry Pi, 1 to 2 expansion
  3. Pi Juice Hat
    1. Amazon, very costly but looks like latest model
    2. Digikey, fair price but looks like old model
  4. Adafruit Motor Bonnet for Raspberry Pi
  5. DFrobot RPi zero IO Expansion Hat
  6. DFrobot Ultrasonic Sensor, URM09 Analog 
  7. DFronot i2c Digital Wattmeter 
  8. Mini Breadboard
  9. 3mm LED for front light
  10. Micro LED 0603 for back light
  11. 1.5V AA Batteries
    1. I used EBL ones
  12. Lego Power Functions Servo Motor
    1. One for steering and one for Transmission
  13. Lego Power Functions L-Motor
    1. I used two
  14. Lego Power Functions Battery Box for AA
  15. Lego Power Function Extension Cable, 20"
  16. Dupont Connector Kit
  17. Crimping Tool for Dupont Connectors
  18. Ferrule Crimping Toolset
  19. Wire Stripping Tool
  20. Paper/Utility knife
    1. To cut and separate wires of Lego extension cable

Software

  1. Raspberry Pi OS Lite, 
    1. with no GUI as it's not needed on Car
  2. Adafruit python library for Motor Bonnet
    1. Edit /usr/local/lib/python3.7/dist-packages/adafruit_motorkit.py or locate adafruit_motorkit.py based on installation
    2. Add default parameter, pca_frequence=1600 like this


    3. Dfrobot Wattmeter Code
    4. PiJuice Code
    5. My Test Code. FOR REFERENCE ONLY, DON'T JUST COPY PASTE and USE IT.
      1. Controller.py
        1. Main file to control the car, it uses curses lib.
        2. + is shift up, - is shift down
        3. w is steering straight, a is steering left, d is steering right
        4. s is to stop
        5. UP arrow increase Throttle/power to motor
        6. Down arrow decrease Throttle/power to motor
        7. q to quit
      2. car.py
        1. Module which implements Car's functionalities

Wiring

I use Lego Extension cables when connecting Lego motors and motor driver board. This way, Lego motors can be reuse in pure Lego based projects.

Cable for Lego Power Functions Battery

Lego cable has four wires. Wires on each side doesn't change polarity when battery box switch turns to either side. Right outer cable is +ve and left outer is -ve. Use this to attach to desired power source. 
See this picture to get an idea


Caution: Use multi meter to confirm polarity

Cable for Lego Power Functions Motor

Middle two wires are used to power Lego PF motors. 
I prefer to use light grey head side, (which doesn't fit the battery), for motor connection as it can be attached to Lego Buggy Motor. Picture for information 

Cable for Lego Power Functions Servo

Lego PF servo uses all four wires. Side wires are to power and middle two wires are used to set duty cycle and direction. I use breadboard to share battery power with PF Servos.

See picture for idea 

Also see Ideas on how to Control Lego Servo

Setup

My Raspberry Pi Zero W with other boards stacking looks like this


  1. Raspberry Pi Zero W
  2. 1 to 2 GPIO Expansion Kit
    1. Motor Driver board  to the side
    2. Pijuice on Top side of GPIO Expansion Kit
    3. IO Expansion kit
    4. Breadboard attached to the kit
More pictures from different sides



I updated model and attached, camera, distance sensor, lights, though they are not operational yet. Model looks like this





Demo

Without Load

Or 

Running on floor

Or 

Note engine speed on shifting to 4th gear, it's slow. Reading motor battery was on 3V. Not sure if batteries were not able to handle such load or was there any other issue.

Next Step

  1. Hook up sensors, lights, Camera and Automated Action
  2. Use a Remote not laptop, which looks something like this




    1. Yep, it has Google Coral 

Sunday, September 20, 2020

Controlling Lego Power Functions Servo Motor

 Idea

Control Lego Power Functions Servo motor to it's full functionality. The Servo motor moves to 90 degree on both sides assuming, center is at 0 and it can also do 7 steps to each side.

Implementation

Lego Power Functions uses PWM frequency of 1150 Hz. Using this frequency, Power Functions servo can do 7 steps using duty cycles, 26.6, 38.9, 51.2, 63.0, 75.0, 87.2 and 100. I confirmed my tinkering with oscilloscope, that it is giving correct frequency and duty cycles. 

Below are my findings so far

Microbit

Kitronik All in one Robotic board

This is the first board, I have tinkered with. It can be powered with Lego 8881 battery box. By setting PCA frequency to 1150, it can step through with correct duty cycles. 

The microbit Makecode is here. To set desired PWM frequency for this board, see line 132 in robotics.ts.  I also added a functionality to brake motor, see Line 303 robotics.ts

Dfrobot Driver expansion board

My tinkering failed with this board. After updating the code, stepping always tunring motor to all the way 90 degree. Oscilloscope reading was not showing correct frequency and duty cycle which I was using.  

I don't have electrical, electronics knowledge but my guess is it is due to the design of the board. This board has led which light up when motors are running. These leds are lighting up when move motors by hand.

Elecfreaks Motor:bit

This board just have a TB6612 based motor driver chip. PWM has to be set by Microbit using analogSetPeriod. See forward function here at Line 24

Testing of this is below in Slow motion
or




Raspberry Pi

Adafruit DC motor Bonnet

The board is available here, Adafruit has detailed steps on how to use this board with Raspberry Pi, so just used those steps

By default, PWM frequency is set to 1600. After installing the library, I changed the code to accept pca_frequency when creating the class object. To do so
  1. Edit /usr/local/lib/python3.7/dist-packages/adafruit_motorkit.py or locate adafruit_motorkit.py based on installation
  2. Add default parameter, pca_frequence=1600 like this


Wiring

Lego PF servo uses all four wires. Side wires are to power and middle two wires are used to set duty cycle and direction. 

I use Lego PF Extension wires to connect Servo with custom Motor Driver boards. This way the motor can be reuse in Pure Lego based projects

This picture should give an idea about wiring and connections