Uncategorized

hc12 testing notes

pi-top forum

Making a Rpi Pico Based Smart Vehicle

Projects

Making a Rpi Pico Based Smart Vehicle

ProjectsJun 3024 / 24Oct 1124d ago

tlfong0113 Jun 30

I am going start a project on a Pico based smart vehicle. The project will be in many parts. The first part is summarized below.

Pico Smart Vehicle, Part 1 – Controlling a DC motor.

Introduction

This project is on how to use the Rpi Pico with a DC motor controller, such as L298N, to drive a toy DC motor with a speed encoder, such as the N20.

This first part of the project is focused on Pico, Motor Controller, and DC motor.

Rpi4B or Pi-Top 4 would be used as the master controller to communicate with this motor controller, and also controllers of other actuators and senors.

Update 2021jun30hkt2044

When I said above that I would use Rpi4B or Pi-Top 4 as the master controller, I had little confidence I was saying something sensible, because I never saw a Pi-Top 4 before. So I watched a recent video ([Ref 4])((https://www.youtube.com/watch?v=wFWbuj9JdiQ 4)) to make sure I know what is going on recently.

I was glad to see the video title “Rpi 4 on the Go” and that I can use Rpi OS instead of Pi-Top OS. The touch screen and BlueTooth keyboard also look impressive.

However, I am a very slow guy, so I will be going very slowly, with this Part 1 of controlling a DC motor. :slight_smile:

One other thing is that I am not too sure that I am doing the right thing in this forum. I used to write sort of blogs in rpi.org forum, and also short answers in StackOverflow and Stack Exchange Q&A sites such as for Rpi… So this kind of project discussion topic looks very new to me. I guess I need to search to find out how should I start a project discussion topic.

So I searched and found this post about projects category (Ref 5). I am glad to know that this is a new thing, so I arrived in good time.


References

  1. Compatible motors/cabling – @Ltrain, 2021may25 2
  2. N20 Gear Motor (50:1 Ratio, 460 rpm, with Encoder) – Servo City 2
  3. How to Use Your Raspberry Pi Pico With DC Motors (Using DRV8833, L298 or L9110S) – By Les Pounder, Tom’s Hardware 2021jan30 6
  4. Raspberry Pi 4 On The Go! Pi-Top 4 FHD Touch Display & Bluetooth Keyboard Review – 2021jan25, 74,468 views 4
  5. About the Projects category post – pi-topTEAM, 2021mar19
  6. Dr. William Rankin Lecture (On Design etc) 1:18 hrs – Arkansas State 1.2K subscribers, 579 views, 2014sep05 2

2 Replies2Reply

  • createdJun 30
  • last reply24d
  • 23replies
  • 1.1kviews
  • 1user
  • 3likes
  • 12links
  • 24

tlfong01Jul 7 tlfong01:

Next step is to setup and test the Toshiba TB6612FNG Dual DC Motor Driver, to control the direction and speed (using PWM) of the SPV 2WD’s two N20 DC motors.


Now I am assembling the TB6612FNG test rig board


tb6612fng_setup_2021jul07011024×478 140 KB


tb6612fng_setup_2021jul07021009×367 81.4 KB

Design note:

I have selected TB6612FNG which has separate PWM speed control for each motor, and not RDV8833 which does not have separate motor speed control.


TB6612FNG Programming Cheat Sheettb6612fng_control_2021jul07011134×356 88.8 KB

Next step is doing the wring, and try PWM speed control.


References

(1) pi-top/pi-top-Python-SDK – pi-top
github.com 1

pi-top/pi-top-Python-SDK 1

pi-top’s Python SDK (pitop package). Contribute to pi-top/pi-top-Python-SDK development by creating an account on GitHub.

(2) pi-top Python SDK (Preview)

(3) pi-top Python SDK – 6.3 Encoder Motor

Note from SDK 6.3: pi-top motor encoders use a built-in closed-loop control system, that feeds the readings from an encoder sensor to an PID controller. This controller will actively modify the motor’s current to move at the desired speed or position, even if a load is applied to the shaft.


Appendices

Appendix A – pi-top Python SDK (Preview) – DIY Rover API

  1. A simple, modular interface for interacting with a pi-top and its related accessories and components.
  2. This SDK aims to provide an easy-to-use framework for managing a pi-top. It includes a Python 3 package (pitop), with several modules for interfacing with a range of pi-top devices and peripherals It also contains CLI utilities, to interact with your pi-top using the terminal.
  3. Status: Active Development – This SDK is currently in active development.
  4. Supports all pi-top devices:
  5. Supports pi-top Maker Architecture (PMA)
  6. Supports all pi-top peripherals
  7. Backwards Compatibility
  8. The SDK is included out-of-the-box with pi-topOS.
  9. This library is installed as a Python 3 module called pitop. It includes several submodules that allow you to easily interact with most of the hardware inside a pi-top.
  10. Getting started docs
  11. 4.2. Robotics Kit: DIY Rover API

$ 4.2.1 Import modules
from pitop import
(
EncoderMotor,
ForwardDirection,
BrakingType
)

$ 4.2.2 Setup the motors for the rover configuration
motor_left = EncoderMotor(“M3”, ForwardDirection.CLOCKWISE)
motor_right = EncoderMotor(“M0”, ForwardDirection.COUNTER_CLOCKWISE)
motor_left.braking_type = BrakingType.COAST
motor_right.braking_type = BrakingType.COAST

$ 4.2.3 Define some functions for easily controlling the rover

  def drive(target_rpm: float):
      print("Start driving at target", target_rpm, "rpm...")
      motor_left.set_target_rpm(target_rpm)
      motor_right.set_target_rpm(target_rpm)

  def stop_rover():
      print("Stopping rover...")
      motor_left.stop()
      motor_right.stop()

 def turn_left(rotation_speed: float):
     print("Turning left...")
     motor_left.stop()
     motor_right.set_target_rpm(rotation_speed)

 def turn_right(rotation_speed: float):
     print("Turning right...")
     motor_right.stop()
     motor_left.set_target_rpm(rotation_speed)

 $ 4.2.4 Start a thread to monitor the rover

  def monitor_rover():
      while True:
      print("> Rover motor RPM's (L,R):", round(motor_left.current_rpm, 2), round(motor_right.current_rpm, 2))
      sleep(1)

  monitor_thread = Thread(target=monitor_rover, daemon=True)
  monitor_thread.start()
  # Go!

  rpm_speed = 100
  for _ in range(4):
      drive(rpm_speed)
      sleep(5)

  turn_left(rpm_speed)
  sleep(5)

  stop_rover()

Reply1 MONTH LATER16 DAYS LATER

tlfong0126 24d

Example commands to move 4 motors

testSetupMoveMotorDirectionSpeedList(‘FourMotorsList’, ‘Forward’, ‘VerySlow’, ‘TwoSeconds’)
testSetupMoveMotorDirectionSpeedList(‘FourMotorsList’, ‘Backward’, ‘VeryFast’, ‘FourSeconds’)


pico 4wd testing 2021oct1001


A complete listing of the previous 4WD program.

# *** pico_4wd_v70.py - tlfong01, 2021oct10hkt2039 ***

from machine import Pin, PWM
import utime

secondsDict = {'TwoSeconds': 2,
               'FourSeconds': 4,
              }

# *** Part 1 - Measure 4WD Motor Speeds ***

intPinNum0 = 4 #GP4
intPinNum1 = 5 #GP5
intPinNum2 = 6 #GP6
intPinNum3 = 7 #GP7

intGpPinNumDict = {'0': 4, # GP4
                   '1': 5, # GP5
                   '2': 6, # GP6
                   '3': 7, # GP7
                  }

intPinNumList = [intPinNum0, intPinNum1, intPinNum2, intPinNum3]

intPin0 = Pin(intPinNum0, Pin.IN, Pin.PULL_DOWN)
intPin1 = Pin(intPinNum1, Pin.IN, Pin.PULL_DOWN)
intPin2 = Pin(intPinNum2, Pin.IN, Pin.PULL_DOWN)
intPin3 = Pin(intPinNum3, Pin.IN, Pin.PULL_DOWN)

intPinDict = {
    '0': intPin0,
    '1': intPin1,
    '2': intPin2,
    '3': intPin3,
    }

global intCount0 
global intCount1
global intCount2
global intCount3

intCount0 = 0
intCount1 = 0
intCount2 = 0
intCount3 = 0

intCountDict = {
    '0': intCount0,
    '1': intCount1,
    '2': intCount2,
    '3': intCount3,
    }
    
def intCallBack0(pin):
    global intCount0
    intCount0 = intCount0 + 1    
    return

def intCallBack1(pin):
    global intCount1
    intCount1 = intCount1 + 1    
    return

def intCallBack2(pin):
    global intCount2
    intCount2 = intCount2 + 1    
    return

def intCallBack3(pin):
    global intCount3
    intCount3 = intCount3 + 1    
    return

intCallBackDict = {
    '0': intCallBack0,
    '1': intCallBack1,
    '2': intCallBack2,
    '3': intCallBack3,    
    }

intPin0.irq(intCallBack0, Pin.IRQ_FALLING)
intPin1.irq(intCallBack1, Pin.IRQ_FALLING)
intPin2.irq(intCallBack2, Pin.IRQ_FALLING)
intPin3.irq(intCallBack3, Pin.IRQ_FALLING)

def countIntPinIntPeriod(intPinNum, countPeriod):
    global intCount0
    global intCount1
    global intCount2
    global intCount3
    
    intCount0 = 0
    intCount1 = 0
    intCount2 = 0
    intCount3 = 0

    utime.sleep(countPeriod)
 
    if intPinNum  == 0:
        intCount = intCount0
    elif intPinNum == 1:    
        intCount = intCount1
    elif intPinNum == 2:    
        intCount = intCount2
    else:    
        intCount = intCount3                
    return intCount

def countIntPinNumListIntPeriod(intPinNumList, countPeriod):
    intCountList = [0] * len(intPinNumList)
    for index in range(len(intPinNumList)):
        intCountList[index] = countIntPinIntPeriod(intPinNumList[index], countPeriod)                       
    return intCountList                                                

# *** Test functions ***

def repeatCountIntPinNumListIntPeriod(intPinNumList, countPeriod, pauseTime, repeatTimes):
    print('\n  countIntPinNumListIntPeriod()')
    intGpPinNumList = [0] * len(intPinNumList)
    for index in range(len(intGpPinNumList)):
        intGpPinNumList[index]     = intGpPinNumDict[str(index)]
    print('    intPinNumList           =', intPinNumList)
    print('    intGpPinNumList     =', intGpPinNumList)
    print('    countPeriod (seconds)   =', countPeriod)
    print('    pauseTime (seconds)     =', pauseTime)    
    print('    repeat count times      =', repeatTimes)
    print('')
    
    for count in range(repeatTimes):
        ppsList             = countIntPinNumListIntPeriod(intPinNumList, countPeriod)
        print('    ppsList =', ppsList, end = '')
        print(' , min ', min(ppsList), end = '')
        print(' , max ', max(ppsList), end = '')
        print(' , dif ', max(ppsList) - min(ppsList), end = '')
        print(' , avg ', int(sum(ppsList) / len(ppsList)))
    
        ''' 
        rpmList             = ppsList.copy()
        
        for index in range(len(rpmList)):
            rpmList[index] = int(((rpmList[index] / 12) / 90) * 10 * 60)                         
    
        print(' rpmList =', rpmList, end = '')
        print(' , min ', min(rpmList), end = '')
        print(' , max ', max(rpmList), end = '')    
        print(' , avg ', int(sum(rpmList) / len(rpmList)))
        '''
        
        utime.sleep(pauseTime)
    
    return

# *** Part 3 - TB6612FNG Motor Driver Functions ***

stdByPinNum0 = 8
stdByPinNum1 = 9

aIn1PinNum0  = 10
aIn2PinNum0  = 11
aPwmPinNum0  = 0

bIn1PinNum0  = 12
bIn2PinNum0  = 13
bPwmPinNum0  = 1

aIn1PinNum1  = 14
aIn2PinNum1  = 15
aPwmPinNum1  = 2

bIn1PinNum1  = 16
bIn2PinNum1  = 17
bPwmPinNum1  = 3

motorConfigDict00 = {'MotorDriverNum': 0, 'ChannelNum': 0}
motorConfigDict01 = {'MotorDriverNum': 0, 'ChannelNum': 1}
motorConfigDict10 = {'MotorDriverNum': 1, 'ChannelNum': 0}
motorConfigDict11 = {'MotorDriverNum': 1, 'ChannelNum': 1}

motorConfigDictList_00_01_10_11 = [motorConfigDict00, motorConfigDict01, motorConfigDict10, motorConfigDict11]
motorConfigDictList01 = motorConfigDictList_00_01_10_11

motorConfigDictListDict = {'FourMotorsList' : motorConfigDictList01,
                }

motorDriverGpPinNumDict = { \
    '0': {'StdByPinNum'  : stdByPinNum0,             
          '0' : {'In1PinNum' : aIn1PinNum0,  
                 'In2PinNum' : aIn2PinNum0,  
                 'PwmPinNum' : aPwmPinNum0,
                 'PwmFreq'   : 1000,
                 'DutyCycle' : 20,
                },
          '1' : {'In1PinNum' : bIn1PinNum0,  
                 'In2PinNum' : bIn2PinNum0,  
                 'PwmPinNum' : bPwmPinNum0,
                 'PwmFreq'   : 1000,
                 'DutyCycle' : 20,                 
                },  
          },                   
    '1': {'StdByPinNum'  : stdByPinNum1,             
          '0' : {'In1PinNum' : aIn1PinNum1,  
                 'In2PinNum' : aIn2PinNum1,  
                 'PwmPinNum' : aPwmPinNum1,
                 'PwmFreq'   : 1000,
                 'DutyCycle' : 20,                 
                },
          '1' : {'In1PinNum' : bIn1PinNum1,  
                 'In2PinNum' : bIn2PinNum1,  
                 'PwmPinNum' : bPwmPinNum1,
                 'PwmFreq'   : 1000,
                 'DutyCycle' : 20,                 
                },  
          }, 
    }

def setupMotorBasic(motorConfigDict):
    motorDriverNum = motorConfigDict['MotorDriverNum']
    channelNum     = motorConfigDict['ChannelNum']
    
    stdByPinNum = motorDriverGpPinNumDict[str(motorDriverNum)]['StdByPinNum']
    in1PinNum   = motorDriverGpPinNumDict[str(motorDriverNum)][str(channelNum)]['In1PinNum']
    in2PinNum   = motorDriverGpPinNumDict[str(motorDriverNum)][str(channelNum)]['In2PinNum']
    
    stdByPin    = Pin(stdByPinNum, Pin.OUT)
    in1Pin      = Pin(in1PinNum, Pin.OUT)    
    in2Pin      = Pin(in2PinNum, Pin.OUT)

    pwmPinNum   = motorDriverGpPinNumDict[str(motorDriverNum)][str(channelNum)]['PwmPinNum']
    pwmFreq     = motorDriverGpPinNumDict[str(motorDriverNum)][str(channelNum)]['PwmFreq']    
    dutyCycle   = motorDriverGpPinNumDict[str(motorDriverNum)][str(channelNum)]['DutyCycle']      
    
    pwmPin      = PWM(Pin(pwmPinNum))
    pwmPin.freq(pwmFreq)
    u16DutyCycle = int((dutyCycle / 100) * 65536)  
    pwmPin.duty_u16(u16DutyCycle)
    
    motorControlDict = {'StdByPin': stdByPin,
                        'In1Pin'  : in1Pin,
                        'In2Pin'  : in2Pin,
                        'PwmPin'  : pwmPin,
                       }
    return motorControlDict

dutyCycleDict = {
    'VeryVerySlow' : 95,
    'VeryFast'     : 90,
    'Fast'         : 80,
    'Normal'       : 50,
    'Slow'         : 40,
    'VerySlow'     : 30,
    'VeryVerySlow' : 25,
    }

def setupMotorList(motorConfigDictList):
    motorControlDictList = [0] * len(motorConfigDictList)        
    for index in range(len(motorConfigDictList)):
        motorControlDict = setupMotorBasic(motorConfigDictList[index])
        motorControlDictList[index] = motorControlDict
    return motorControlDictList

def moveMotorDirectionSpeedList(motorControlDictList, directionName, speedName):
    for motorControlDict in motorControlDictList:
        moveMotorDirectionSpeed(motorControlDict, directionName, speedName)
    return

def moveMotorDirectionSpeed(motorControlDict, directionName, speedName):
    moveMotorDirection(motorControlDict, directionName)
    moveMotorSpeed(motorControlDict, speedName)
    return

def moveMotorDirection(motorControlDict, directionName):
    if directionName =='Forward':
        motorControlDict['In1Pin'].low()
        motorControlDict['In2Pin'].high()
    elif directionName == 'Backward':
        motorControlDict['In1Pin'].high()
        motorControlDict['In2Pin'].low()       
    return
    
def moveMotorSpeed(motorControlDict, speedName):
    pwmPin = motorControlDict['PwmPin']
    dutyCycle = dutyCycleDict[speedName]
    pwmPin.duty_u16(int((dutyCycle / 100) * 65536) )
    return

def stopMotor(motorControlDict):
    motorControlDict['In1Pin'].low()
    motorControlDict['In2Pin'].low()
    return

def stopMotorList(motorControlDictList):
    for motorControlDict in motorControlDictList:
        stopMotor(motorControlDict)
    return
  
def testSetupMoveMotorDirectionSpeedList(motorConfigDictListName, directionName, speedName, secondsName):
    print('Begin testSetupMoveMotorList(), ...')
    motorConfigDictList = motorConfigDictListDict[motorConfigDictListName]
    motorControlDictList1 = setupMotorList(motorConfigDictList)
    moveMotorDirectionSpeedList(motorControlDictList1, directionName, speedName)
    utime.sleep(secondsDict[secondsName])       
    stopMotorList(motorControlDictList1)
    print('End   testSetupMoveMotorList(), ...')    
    return     
    
# ========= ========= ========= ========= ========= ========= ========= ========= 
# ========= ========= ========= ========= ========= ========= ========= =========

# *** Main ***

testSetupMoveMotorDirectionSpeedList('FourMotorsList', 'Forward',  'VerySlow', 'TwoSeconds')
testSetupMoveMotorDirectionSpeedList('FourMotorsList', 'Backward', 'VeryFast', 'FourSeconds')

# *** End ***


Merging PWM and Interrupt Functions into Main Motor Control Functions

PWM functions have been merged and tested OK. Interrupt functions are to be tested.

Penzu complete listing of code: https://penzu.com/p/56eb8c7c


Interrupt count measuring OK (https://penzu.com/p/b176e88b)

>>> %Run -c $EDITOR_CONTENT
Begin testSetupMoveMotorList(), ...
After 2 seconds, ...

  countIntPinNumListIntPeriod()
    intPinNumList           = [0, 1, 2, 3]
    intGpPinNumList         = [4, 5, 6, 7]
    countPeriod (seconds)   = 0.1
    pauseTime (seconds)     = 0.1
    repeat count times      = 10

    countList = [294, 220, 300, 215] , min  215 , max  300 , dif  85 , avg  257
    countList = [267, 226, 300, 210] , min  210 , max  300 , dif  90 , avg  250
    countList = [284, 231, 301, 214] , min  214 , max  301 , dif  87 , avg  257
    countList = [273, 229, 299, 213] , min  213 , max  299 , dif  86 , avg  253
    countList = [290, 219, 301, 218] , min  218 , max  301 , dif  83 , avg  257
    countList = [280, 224, 298, 217] , min  217 , max  298 , dif  81 , avg  254
    countList = [302, 231, 298, 212] , min  212 , max  302 , dif  90 , avg  260
    countList = [276, 216, 304, 216] , min  216 , max  304 , dif  88 , avg  253
    countList = [295, 215, 298, 203] , min  203 , max  298 , dif  95 , avg  252
    countList = [292, 214, 293, 210] , min  210 , max  293 , dif  83 , avg  252
End   testSetupMoveMotorList(), ...
>>> 


Scaling up 4WD with DC Motor x 4 to 6WD with BLDC Motor x 6

Now I am thinking of upgrading my 4WD to 6WD with BLDC motors. The BLDC motor has built in controllers, so there is no need to use any motor controllers. Some newbie is asking a question of testing BLDC motors, and I took the opportunity to do a little research and found it easy to expand the dictionaries for BLDC motors.

Brushless DC motor with built in controller – EESE, Asked 2021oct13


Part 5 – Using Rpi Pico and MicroPython to PWM control BLDC motor speed

Video = https://youtu.be/-omE34cMXj4

Test function =

```
def testBldcMotorV1():
    print('  Begin testBldcMotor(), ...')
    motorConfigDict = {'MotorDriverNum': 2, 'ChannelNum': 0}
    motorControlDict = setupBldcMotor(motorConfigDict)
    print('    Now start fast, ...')
    hold('FourSeconds')
    changeBldcMotorSpeed(motorControlDict, 'Normal')
    print('    Now normal, ...')
    hold('FourSeconds')
    changeBldcMotorSpeed(motorControlDict, 'Slow')
    print('    Now slow, ...')    
    hold('FourSeconds')
    changeBldcMotorSpeed(motorControlDict, 'Fast')
    print('    Now fast again, ...')
    hold('FourSeconds')
    changeBldcMotorSpeed(motorControlDict, 'Slow')
    print('    Now slow again, ...')
    hold('FourSeconds')    
    
    print('  End   testSetupMotor(), ...')
    return

```

Program listing and sample output = https://penzu.com/p/95b30513


Pico 6WD using BLDC motors

I found it easy to expand my 4WD DC motor project to 6WD using BLDC motor. So I am starting off with an A4 size acrylic plate as car body, and Aslong 2535 BLDC motors.


bldc_6wd_2021oct16021024×840 318 KB


I read my post of the result of careless wiring of BLDC motors, just to remind myself.

Brushless DC motor with built in controller – Asked 2021Oct13electronics.stackexchange.com

Brushless DC motor with built in controller

pwm, brushless-dc-motoranswered by tlfong01 on 11:17AM – 13 Oct 21 UTC

Part 6 – Aslong BLDC Postmortemaslong_bldc_2021oct17031024×658 172 KBaslong_bldc_2021oct17011024×595 185 KBaslong_bldc_2021oct17021024×542 134 KB


There you go, BLDC 6WD


bldc_6wd_2021oct17021024×701 248 KB


Testing 4WD, to be scaled up to 6WD

For prototyping, I am testing just 4 motors, instead of 6, so maximum risk is frying 4 motors, instead of 6.

The testing video: https://youtu.be/fKe3huM2Qqc


4WD BLDC motors encoder signals (FG)

Now I am checking out the encoder signals (FG) of the 4 BLDC motors. I powered the four motor with the same 12V PSU and use my quad channel scope to display the encoder output waveforms, as show below. I know the motor speed is 107 rpm. I need to work back the pulses per revolution.


bldc_encoder_2021oct18011134×480 154 KB


Calibrating 4WD BLDC – Speed vs PWM duty cyclebldc_test_2021oct19011024×688 188 KBbldc_test_2021oct19021024×690 184 KBbldc_test_2021oct19031024×807 239 KBbldc_test_2021oct19041024×382 136 KB

Notes

  1. 4 motors with only power, no PWM, tested OK.
  2. Now going to test PWM duty cycle vs speed, for one motor only.

IEEE Spectrum Smart Cars Than Think

I have been reading the above IEEE Spectrum articles for a couple of years, thinking that I might borrow ideas from them.

IEEE Cars That Think – IEEE Spectrum


Big Aslong BLDC Motor Control Signals and PWM vs Speed Calibration


bldc_test_2021oct20011024×1045 328 KBbldc_test_2021oct20021024×696 194 KBbldc_test_2021oct20031024×522 172 KB


Aslong BLDC JGB37-2525 Spec

Now I am studying the BLDC spec, before calibrating things.aslong_spec_2021oct20021024×752 207 KB


aslong_spec_2021oct2003912×677 132 KB


Calibrating PWM duty cycle vs mot speed (FG (encoder) pulses per second)

Now I am using PWM 1kHz 90% duty cycle to measure the speed of 19 pulses per secondpwm_bldc_test_2021oct20011024×626 214 KBpwm_bldc_test_2021oct20021024×342 135 KB


Range of duty cycle when controlling Aslong BLDC motor speed

I found the range is approximately 37% to 100%. I think 99% or 100% should be the same as DC without PWM (to verify later). I also found that the motor slows down as duty cycle goes low.

At around 40%, the motor moves very slowly, and at 37%, the motor comes to stand still.

Again, I need to read the FG (encoder pulses) to get the precise motor speed.


433MHz RF Communication among Pico 4WDs

Now I am thinking of letting the Pico 4WDs to talk to each other using 433MHz transmitter (FS1000A) and receivers (MX05V) The feasibility study is satisfactory. The Pico sends a text message through GP0 (uart0 TxD) and received from GP1 (uart0 RxD). The hardware setup is shown below:fs1000a_mx05v_test_2021oct28011024×1165 464 KB


4WD 433MHz FS1000A/MX05V RF Communication References

Transmitting and Receiving messages through RF433 using Raspberry Pico – RpiSE, Asked 2021oct21

Chat: https://chat.stackexchange.com/rooms/130758/discussion-between-tlfong01-and-antifa

Q&E https://raspberrypi.stackexchange.com/questions/132771/transmitting-and-receiving-messages-through-rf433-using-raspberry-pico


HC12 UART 433MHz transceiver testing notes

JBtek Windows 8 Supported Debug Cable for Raspberry Pi USB Programming USB to TTL Serial Cable – Amazon US$7
amazon.com

Amazon.com: JBtek Windows 8 Supported Debug Cable for Raspberry Pi USB…

Buy JBtek Windows 8 Supported Debug Cable for Raspberry Pi USB Programming USB to TTL Serial Cable: USB Cables – Amazon.com ✓ FREE DELIVERY possible on eligible purchases

PL2303XHD Datasheet – Prolific 2023
http://www.prolific.com.tw/UserFiles/files/ds_pl2303HXD_v1_4_4.pdf

The power pin provides 500mA directly from the USB port and the RX/TX pins are 3.3V level for interfacing with the most common 3.3V logic level chipsets
Windows XP/Vista/7 & Windows 8 supported, MacOS X; PL2303 TA. drivers on your computer and connect with a terminal program at 115200 baud

Red cable    : +5V
Black cable  : GND
Green cable  : TXD
White cable  : RXD

Yellow cable : RTS
Blue cable   : CTS


hc12_202aoct3001827×589 124 KBhc12_202aoct30021024×603 193 KBhc12_202aoct30031024×668 181 KBhc12_202aoct30041024×546 202 KB


RealTerm Configuring HC12 433MHz Transceiver Recordhc12_real_term-TEST_2021oct3001718×393 141 KBhc12_real_term-TEST_2021oct3002720×392 125 KBhc12_real_term-TEST_2021oct3003716×391 143 KB


Pico 4WD BLDC Quad HC12 433MHz RF Transceiver Setup Noteshc12_2021nov01011024×872 248 KBhc12_2021nov01021024×1108 332 KB


Dual HC12 RF transceiver setup notesdual_hc12_setup_2021nov0302692×714 184 KBdual_hc12_setup_2021nov03031024×851 343 KB


HC12 at RealTerm COM10 transceiving to/from HC12 at RealTerm COM9 Tested OK


hc12_real_term-TEST_2021oct3004689×887 163 KB


Testing HC12 #1 at Pico 1’s uart0 transceiving HC12 #2 at same Pico 1’s uart1

Now I am going to test if two HC12’s (on the same bread board, separated by 1 cm), controlled by two UART’s (uart0, uart1) of the same Pico can transmit/receive at RF 433MHz without any problem.


/ to continue, …ReplyShareBookmarkFlagReplyWatchingYou will receive notifications because you created this topic.

Suggested Topics

TopicRepliesViewsActivity
[WIP] Raspberry Pi IOT ServerProjects5220Jun 12
[WIP] – pt-Pico Weather StationProjects5502Apr 16
Turn Pi-Top 4 into a Portable Learning Management System (LMS)Projects1166May 29
Pi-top[4] IOT DeviceProjects2186May 21
Pi-top Display power issuespi-top [4]helpdisplay18347Feb 5

Want to read more? Browse other topics in Projects or view latest topics.

Categories: Uncategorized

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.