In order to control traction we first need to detect when traction has failed. This post presents a hardware and software solution for efficiently detecting when traction is lost.
One of the challenges with detecting a loss of traction is that there is a lot happening. The RCArduino test vehicle generates two interrupts for each revolution of each wheel. With the four wheels rotating as much as 80 times per second, thats 2 * 4 * 80 = 640 interrupts per second. If we add two or three RC Channels we quickly approach 1000 interrupts per second.
It might sound like a lot to process, 1000 interrupts in a second, but the 16Mhz processor in your Arduino is able to get through 16,000 operations in each one thousandth of a second.
Bench Testing | Road Testing More lights = Less traction. You can see the car light up on acceleration and the lights go one by one as traction is recovered. |
If the processor is so fast, why do we need to focus on efficiency ?
The problem is that there will be times when all of our interrupts will occur at the same time. The Arduino is only able to process one interrupt at a time and so a queue will be formed. The interrupts within the queue are processed according to a fixed priority, not the time at which they occured.
The interrupts we are interested in are listed below according to the priority with which they are processed
INT0 - External Interrupt 0 - used to read RC Channels or wheel rotations
INT1 - External Interrupt 1- used to read RC Channels or wheel rotations
PCINT0 - Pin change interrupts - used to read RC Channels or wheel rotations
PCINT1 - Pin change interrupts - used to read RC Channels or wheel rotations
PCINT2 - Pin change interrupts - used to read RC Channels or wheel rotations
TIMER1COMPA - Used by the servo library to generate output pulses
If each type of interrupt takes 10 microseconds to process, we could have the signals we want to send to our ESC or steering servo (TIMER1COMPA in the table above) disrupted by upto 50 microseconds which can represent as much as a 10 percent error in the throttle and steering signals.
You can find a full list of the interrupt vectors and the order in which they are processed in the ATMega328 Datasheet under the second '11.4 Interrupt Vectors in ATmega328P' in the table 'Table 11-6. Reset and Interrupt Vectors in ATmega328'
You can find more background on clashing/queuing interrupts in this post introducing the RCArduinoFastLib which includes an explanation of the diagram below -
Error introduced when interrupts collide
Reducing interrupt clashes in Arduino RC Projects -
http://rcarduino.blogspot.ae/2012/11/how-to-read-rc-channels-rcarduinofastlib.html
Pin Change Interrupts Vs Port Change Interrupts
The Arduino UNO, Leonardo, Mini and Micro have only two external interrupts, so how will we read four wheel sensors and two or more RC Channels ?
In the past the RCArduinoBlog has featured the pinchangeinterrupt library, this uses a capability of the ATMega chip in your Arduino to attach an interrupt to any of the 19 pins. The pinchangeint library adds higher level code to this low level capability in order to provide very similar functionality to the two external interrupts.
More here - http://rcarduino.blogspot.com/2012/03/need-more-interrupts-to-read-more.html
This convenience comes at a high cost in terms of performance but fortunately there is a simple trick we can use to access more interrupts without the performance hit of the pinchangeint library.
Introducing Port Change Interrupts - A Simple Trick
If we limit ourselves to using just one pin from each of the Arduino ports we can eliminate all of the processing overhead normally required to determine which pin has caused the interrupt. This approach provides us with a total of five highly efficient interrupts, enough for four wheel sensors and a PPM Stream containing our RC Channel information.
Ok, but whats a port ?
The ATMega microprocessor in your Arduino has its pins arranged into ports, the following diagram shows how the Arduino software maps digital and analogue pins onto the ATMega 328 microprocessor ports. Similar diagrams are available for the ATMega 32u4 and ATMega 2560 used in the Leonardo and Mega.
The diagrams all show the pin function assigned by Arduino in red accompanied by black text which gives the ATMega port, pin number and any additional functions supported by the pin.
If we look at the Arduino pin labelled digital pin 2 we can see that nearest the pin, this is also labelled PD2, this tells us that the pin is pin number 2 on PORT D.
The ATMega 328 has three ports -
PORTB (digital pin 8 to digital pin 13)
PORTC (analog pin 0 to analog pin 5)
PORTD (digital pin 0 to digital pin 7)
To create a port change interrupt we must select a single pin from a port. If we try to use more than one pin on a single port we will need additional code to determine which pin has changed, this will quickly use up our performance advantage.
As an example of the cost of having multiple pin change interrupts on a single port, the pinchangeint library is around 5 times less efficient than an external interrupt.
If we limit ourselves to this one pin per port approach we can have three additional interrupts with no lose in performance.
A Quick Introduction To Direct Port Manipulation and Registers
Have you ever seen code that looks like the following -
PORTB ^= (1<<5);
It might look like low level assembly but it isn't, its accessing the chip registers directly and there are two reasons why we would want to do this -
1) Performance - direct access is very fast, the code sample above could be 10 times faster than calling the equivalent digitalWrite(13,!digitalRead(13));
2) Configuration - Registers set up and control each of the chips modules, sometimes we will need to access a module which is not set up by default.
Registers can be thought of as a set of related switches which can be turned on and off to control some part of the chips behavior. Once you know the registers used by the modules your interested in, its as simple as programming the push button interface of a kitchen appliance.
Lets walk through the set up we need for the pin change interrupts used in the traction control project.
Step One - Turning on pin change interrupts
Pin change interrupts are turned on through the PCICR (Pin Change Interrupt Control Register). Keep in mind that this register is just a collection of on/off switches, in this register there are only three switches named PCIE2, PCIE1 and PCIE0. These three switches turn the pin change interrupt module on or off for PORTD, PORTC and PORTB respectively -
PORTB (digital pin 8 to digital pin 13)
PORTC (analog pin 0 to analog pin 5)
PORTD (digital pin 0 to digital pin 7)
As our project will require pin change interrupts to be enabled on all three ports, we will need to turn the three switches on by setting the corresponding bit in the register to 1, it looks like this -
PCICR = (1<<PCIE2)|(1<<PCIE1)|(1<<PCIE0);
Each useable bit in every register is assigned a name in the datasheet, when we use the bit name in our code, it evaluates to the bit number in the register, not the bit value. To convert the bit number to the bit value we use the following notation
bit value = (1 << bit number)
We can combine values using the bitwise or operator '|' and thats how we arrived at the code above (and below) -
PCICR = (1<<PCIE2)|(1<<PCIE1)|(1<<PCIE0); // turn on PCIE2, PCIE1 and PCIE0 in the PCICR register
Step Two - Choosing our interrupt pins and linking them to a pin change interrupt
We have discussed that there is a major performance benefit in enabling just one pin change interrupt on each port and this is easily done through setting the corresponding but in a mask register however before we do this we should return to the pin mapping diagram and take a closer look at the secondary functions of each pin.
The text between the brackets indicates the additional functions supported by each pin, for example analog input 0 has ADC0 and PCINT8 (analog to digital converter 0 and pin change interrupt 8).
We have two goals in selecting the pins -
1) Choose the pins so that we only enable one from each of the ports
2) Choose pins where we do not expect to use the secondary function later in our project - I might want to use SPI for data logging for example so must avoid these pins.
For now I have selected the following pins to enable our port change interrupts -
For now I have selected the following pins to enable our port change interrupts -
digital pin 4 (PCINT20,XCK,T0) // PD4, pin 4 on PORT D
digital pin 8 (PCINT0,CLKO/ICP1) // PB0, pin 0 on PORT B
analog input 0(ADC0,PCINT8) // PC0, pin 0 on PORT C
digital pin 8 (PCINT0,CLKO/ICP1) // PB0, pin 0 on PORT B
analog input 0(ADC0,PCINT8) // PC0, pin 0 on PORT C
Now that we have our pins, we can use the mask registers associated with each port to attach the interrupt.
PCMSK0 = (1 << PCINT0 ); // enable pin change interrupts on PCINT0 contained in register PCMSK0
PCMSK1 = (1 << PCINT8); // enabled pin change interrupts on PCINT8 contained in register PCMSK1
PCMSK2 = (1 << PCINT20); // enabled pin change interrupts on PCINT20 contained in register PCMSK2
All of this information, including the chip modules, the registers associated with each module and the individual switches within the registers can be found in the datasheet. In this case we are dealing with PCICR and the PCMSKn registers found in sections 13.2.5 to 13.2.8 of the ATMega328 Datasheet.
http://www.arduino.cc/en/Reference/PortManipulation
The code -
#define IDLE_PERIOD 200
#define FLAG_FRONT_LEFT 1
#define FLAG_REAR_LEFT 2
#define FLAG_REAR_RIGHT 4
#define FLAG_FRONT_RIGHT 8
volatile uint16_t unPeriodFR;
volatile uint16_t unPeriodFL;
volatile uint16_t unPeriodRR;
volatile uint16_t unPeriodRL;
volatile uint8_t sFlags;
#define GREEN_INDICATOR 9
#define YELLOW_INDICATOR 10
#define RED_INDICATOR 11
void setup() {
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(8,INPUT);
pinMode(A0,INPUT);
pinMode(6,OUTPUT);
pinMode(GREEN_INDICATOR,OUTPUT);
pinMode(YELLOW_INDICATOR,OUTPUT);
pinMode(RED_INDICATOR,OUTPUT);
// enable the external interrupt
EIMSK = 2; //1 - enable external interrupt 1
EICRA = 12; //3 - enable interrupt on rising edge only
// enable the pin change interrupts
PCICR = _BV(PCIE0)|_BV(PCIE1)|_BV(PCIE2);
PCMSK0 = 1;//PORT B
PCMSK1 = 1;//PORT C
PCMSK2 = 16;//PORT D
TCCR1A = 0;
TCCR1B=0x05;//Prescaler= 1024
Serial.begin(9600);
}
void loop() {
static uint16_t unLocalPeriodFR;
static uint16_t unLocalPeriodFL;
static uint16_t unLocalPeriodRR;
static uint16_t unLocalPeriodRL;
static uint32_t ulLastUpdate;
static uint8_t sLocalFlags;
delay(100);
// Take a temporary copy of the periods
uint8_t sreg = SREG;
cli();
unLocalPeriodFR = unPeriodFR;
unLocalPeriodFL = unPeriodFL;
unLocalPeriodRR = unPeriodFR;
unLocalPeriodRL = unPeriodFL;
sLocalFlags = sFlags & (FLAG_FRONT_RIGHT | FLAG_FRONT_LEFT);
sFlags = 0;
SREG = sreg;
if(sLocalFlags)
{
ulLastUpdate = millis();
uint16_t unTop = unLocalPeriodFR;
if(unLocalPeriodFL > unTop)
{
unTop = unLocalPeriodFL;
}
if(unLocalPeriodRR > unTop)
{
unTop = unLocalPeriodRR;
}
if(unLocalPeriodRL > unTop)
{
unTop = unLocalPeriodRL;
}
uint16_t unBottom = unLocalPeriodFR;
if(unLocalPeriodFL < unBottom)
{
unBottom = unLocalPeriodFL;
}
if(unLocalPeriodRR < unBottom)
{
unBottom = unLocalPeriodRR;
}
if(unLocalPeriodRL < unBottom)
{
unBottom = unLocalPeriodRL;
}
Serial.print(unTop);
Serial.print(" ");
Serial.print(unBottom);
Serial.print(" ");
Serial.println(unTop>>3);
// if the difference is greater than 1/8th of top
uint16_t unDifference = (unTop - unBottom);
if(unDifference > (unTop >> 3))
{
tone(6,69);
}
else
{
noTone(6);
}
digitalWrite(GREEN_INDICATOR,unDifference > (unTop >> 3)); // difference > 1/8th of top
digitalWrite(YELLOW_INDICATOR,unDifference > (unTop >> 2)); // difference > 1/4 of top
digitalWrite(RED_INDICATOR,unDifference > (unTop >> 1)); // difference > 1/2 of top
}
if((millis() - ulLastUpdate) > IDLE_PERIOD)
{
noTone(6);
digitalWrite(GREEN_INDICATOR,LOW); // difference > 1/8th of top
digitalWrite(YELLOW_INDICATOR,LOW); // difference > 1/4 of top
digitalWrite(RED_INDICATOR,LOW); // difference > 1/2 of top
}
}
ISR(INT0_vect)
{
}
// WHEEL ATMEGA pin, ports and masks
// FL 5 PORTD3 8 (also INT1)
// FR 6 PORTD4 16
// RR 8 PORTB0 1
// RL A0 PORTC0 1
// WHEEL ATMEGA pin, ports and masks
// FL 5 PORTD3 8 (also INT1)
ISR(INT1_vect)
{
static uint16_t unLastTimer;
if(PIND&8)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodFL = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement unLastTimer = TCNT1;
unLastTimer =TCNT1;
sFlags |= FLAG_FRONT_LEFT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// FR 6 PORTD4 16
ISR(PCINT2_vect)
{
static uint16_t unLastTimer;
if(PIND & 16)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodRL = TCNT1-unLastTimer;
unLastTimer = TCNT1;
sFlags |= FLAG_REAR_LEFT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// RR 8 PORTB0 1
ISR(PCINT0_vect)
{
static uint16_t unLastTimer;
if(PINB & 1)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodRR = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement.
unLastTimer = TCNT1;
sFlags |= FLAG_REAR_RIGHT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// RL A0 PORTC0 1
ISR(PCINT1_vect)
{
static uint16_t unLastTimer;
if(PINC & 1)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodFR = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement.
unLastTimer = TCNT1;
sFlags |= FLAG_FRONT_RIGHT;
}
}
}
#define FLAG_FRONT_LEFT 1
#define FLAG_REAR_LEFT 2
#define FLAG_REAR_RIGHT 4
#define FLAG_FRONT_RIGHT 8
volatile uint16_t unPeriodFR;
volatile uint16_t unPeriodFL;
volatile uint16_t unPeriodRR;
volatile uint16_t unPeriodRL;
volatile uint8_t sFlags;
#define GREEN_INDICATOR 9
#define YELLOW_INDICATOR 10
#define RED_INDICATOR 11
void setup() {
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(8,INPUT);
pinMode(A0,INPUT);
pinMode(6,OUTPUT);
pinMode(GREEN_INDICATOR,OUTPUT);
pinMode(YELLOW_INDICATOR,OUTPUT);
pinMode(RED_INDICATOR,OUTPUT);
// enable the external interrupt
EIMSK = 2; //1 - enable external interrupt 1
EICRA = 12; //3 - enable interrupt on rising edge only
// enable the pin change interrupts
PCICR = _BV(PCIE0)|_BV(PCIE1)|_BV(PCIE2);
PCMSK0 = 1;//PORT B
PCMSK1 = 1;//PORT C
PCMSK2 = 16;//PORT D
TCCR1A = 0;
TCCR1B=0x05;//Prescaler= 1024
Serial.begin(9600);
}
void loop() {
static uint16_t unLocalPeriodFR;
static uint16_t unLocalPeriodFL;
static uint16_t unLocalPeriodRR;
static uint16_t unLocalPeriodRL;
static uint32_t ulLastUpdate;
static uint8_t sLocalFlags;
delay(100);
// Take a temporary copy of the periods
uint8_t sreg = SREG;
cli();
unLocalPeriodFR = unPeriodFR;
unLocalPeriodFL = unPeriodFL;
unLocalPeriodRR = unPeriodFR;
unLocalPeriodRL = unPeriodFL;
sLocalFlags = sFlags & (FLAG_FRONT_RIGHT | FLAG_FRONT_LEFT);
sFlags = 0;
SREG = sreg;
if(sLocalFlags)
{
ulLastUpdate = millis();
uint16_t unTop = unLocalPeriodFR;
if(unLocalPeriodFL > unTop)
{
unTop = unLocalPeriodFL;
}
if(unLocalPeriodRR > unTop)
{
unTop = unLocalPeriodRR;
}
if(unLocalPeriodRL > unTop)
{
unTop = unLocalPeriodRL;
}
uint16_t unBottom = unLocalPeriodFR;
if(unLocalPeriodFL < unBottom)
{
unBottom = unLocalPeriodFL;
}
if(unLocalPeriodRR < unBottom)
{
unBottom = unLocalPeriodRR;
}
if(unLocalPeriodRL < unBottom)
{
unBottom = unLocalPeriodRL;
}
Serial.print(unTop);
Serial.print(" ");
Serial.print(unBottom);
Serial.print(" ");
Serial.println(unTop>>3);
// if the difference is greater than 1/8th of top
uint16_t unDifference = (unTop - unBottom);
if(unDifference > (unTop >> 3))
{
tone(6,69);
}
else
{
noTone(6);
}
digitalWrite(GREEN_INDICATOR,unDifference > (unTop >> 3)); // difference > 1/8th of top
digitalWrite(YELLOW_INDICATOR,unDifference > (unTop >> 2)); // difference > 1/4 of top
digitalWrite(RED_INDICATOR,unDifference > (unTop >> 1)); // difference > 1/2 of top
}
if((millis() - ulLastUpdate) > IDLE_PERIOD)
{
noTone(6);
digitalWrite(GREEN_INDICATOR,LOW); // difference > 1/8th of top
digitalWrite(YELLOW_INDICATOR,LOW); // difference > 1/4 of top
digitalWrite(RED_INDICATOR,LOW); // difference > 1/2 of top
}
}
ISR(INT0_vect)
{
}
// WHEEL ATMEGA pin, ports and masks
// FL 5 PORTD3 8 (also INT1)
// FR 6 PORTD4 16
// RR 8 PORTB0 1
// RL A0 PORTC0 1
// WHEEL ATMEGA pin, ports and masks
// FL 5 PORTD3 8 (also INT1)
ISR(INT1_vect)
{
static uint16_t unLastTimer;
if(PIND&8)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodFL = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement unLastTimer = TCNT1;
unLastTimer =TCNT1;
sFlags |= FLAG_FRONT_LEFT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// FR 6 PORTD4 16
ISR(PCINT2_vect)
{
static uint16_t unLastTimer;
if(PIND & 16)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodRL = TCNT1-unLastTimer;
unLastTimer = TCNT1;
sFlags |= FLAG_REAR_LEFT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// RR 8 PORTB0 1
ISR(PCINT0_vect)
{
static uint16_t unLastTimer;
if(PINB & 1)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodRR = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement.
unLastTimer = TCNT1;
sFlags |= FLAG_REAR_RIGHT;
}
}
}
// WHEEL ATMEGA pin, ports and masks
// RL A0 PORTC0 1
ISR(PCINT1_vect)
{
static uint16_t unLastTimer;
if(PINC & 1)
{
// debounce
if((TCNT1-unLastTimer) > 100)
{
unPeriodFR = TCNT1-unLastTimer;
// not strictly accurate, TCNT1 will have advanced between the previous line and this line,
// however we are interested in the difference between our measurements which is not effected
// by this constant error in each measurement.
unLastTimer = TCNT1;
sFlags |= FLAG_FRONT_RIGHT;
}
}
}
Come back next time for track testing the control algorithms
Duane B (RCArduino)
Hi Duane, Just h\ving a good read of your latest blog. Have you considered using a magnet and hall sensor on the outdrives to each wheel hub to detect relative rotation of each axle? May save you painting all of your wheels, and prevent damage etc as all components are inboard and mounted to gearboxes etc.
ReplyDeletecheers
Gra
LEGIT FULLZ & TOOLS STORE
DeleteHello to All !
We are offering all types of tools & Fullz on discounted price.
If you are in search of anything regarding fullz, tools, tutorials, Hack Pack, etc
Feel Free to contact
***CONTACT 24/7***
**Telegram > @leadsupplier
**ICQ > 752822040
**Skype > Peeterhacks
**Wicker me > peeterhacks
"SSN LEADS/FULLZ AVAILABLE"
"TOOLS & TUTORIALS AVAILABLE FOR HACKING, SPAMMING,
CARDING, CASHOUT, CLONING, SCRIPTING ETC"
**************************************
"Fresh Spammed SSN Fullz info included"
>>SSN FULLZ with complete info
>>CC With CVV Fullz USA
>>FULLZ FOR SBA, PUA & TAX RETURN FILLING
>>USA I.D Photos Front & Back
>>High Credit Score fullz (700+ Scores)
>>DL number, Employee Details, Bank Details Included
>>Complete Premium Info with Relative Info
***************************************
COMPLETE GUIDE FOR TUTORIALS & TOOLS
"SPAMMING" "HACKING" "CARDING" "CASH OUT"
"KALI LINUX" "BLOCKCHAIN BLUE PRINTS" "SCRIPTING"
"FRAUD BIBLE"
"TOOLS & TUTORIALS LIST"
=>Ethical Hacking Ebooks, Tools & Tutorials
=>Bitcoin Hacking
=>Kali Linux
=>Fraud Bible
=>RAT
=>Keylogger & Keystroke Logger
=>Whatsapp Hacking & Hacked Version of Whatsapp
=>Facebook & Google Hacking
=>Bitcoin Flasher
=>SQL Injector
=>Premium Logs (PayPal/Amazon/Coinbase/Netflix/FedEx/Banks)
=>Bitcoin Cracker
=>SMTP Linux Root
=>Shell Scripting
=>DUMPS with pins track 1 and 2 with & without pin
=>SMTP's, Safe Socks, Rdp's brute
=>PHP mailer
=>SMS Sender & Email Blaster
=>Cpanel
=>Server I.P's & Proxies
=>Viruses & VPN's
=>HQ Email Combo (Gmail, Yahoo, Hotmail, MSN, AOL, etc.)
*Serious buyers will always welcome
*Price will be reduce in bulk order
*Discount offers will gives to serious buyers
*Hope we do a great business together
===>Contact 24/7<===
==>Telegram > @leadsupplier
==>ICQ > 752822040
==>Skype > Peeterhacks
==>Wicker me > peeterhacks
Hi,
ReplyDeleteI did consider using the outdrives however the two cars I have the biggest traction issues with are both two wheel drive so I do not have a full set of outdrives. I did consider adding outdrives to the non driven wheels just for this purpose but painting the wheel hubs is no hassle at all and works well enough. There are also other advantages - no need to balance additional rotating weight and you can have a lot of light/dark bands on a single hub for higher resolution wheel speed measurements.
Duane.
Hi,
DeleteLike the setup, have been looking at a retro fit TC on Full size 4x4 using ABS valve blocks.
Some questions.
Could I use a VR sensor + conditioner (5v output) and connect directly to the UNO?
Where are you located?
Cheers
Peter
Hi Duane,
ReplyDeleteTrying to get hold of you about a potential collaboration, but can't find your e-mail anywhere - apologies! Could you provide me with an e-mail or contact me at josewareham@obanmultilingual.com?
Many thanks,
Joe
Hi,
ReplyDeleteYou can message me through the Arduino forum, I am user Duane B
Duane B
Hey, what comparators did you use? I'v gotten a sensor worked out, but the change in voltage across the sensing diode is much too low for the arduinos digital inputs.
ReplyDeleteAny help would be greatly apreciated
Hi,
DeleteI used an LM324, it gives four opamps in a single chip. I have configured them as schmitt triggers, but this is more trouble than its worth, next time i will just use the opamps to build comparators.
Duane.
Hi, you have a great project here, congratulation !
ReplyDeletehow do you plan to brake the wheels ??
Have you looked at doing it analogue?
ReplyDeleteI'm in the process of putting traction control on my Dagu Rover 5, using the odometer pulse from the wheels, I'm charging a capacitor through a diode (charge pump), then looking at the voltage with an analogue input.
When a wheel starts to slip, I knock back the PWM signal for that wheel
Could you provide a list of parts that I could use to simply measure the speed of a wheel on my rc car using an arduino?
ReplyDeleteNow get hassle free moving services at your door. Contact best relocation companies in Dubai to avail cost effective and quality commercial or home moving and shifting services in Dubai.
ReplyDeleteTo get a quote contact us:
☎ +97142664626
Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts.Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.
ReplyDeletelogistics ideas
logistics and supply chain
shipping ideas
supply chain management
Logistics
Our dedicated and economical service ensures you that your valuables are going to be handling with full safety and security. Thanks to sharing such thoughtful knowledge I like your work, keep it up. We can help you to learn and comprehend movers and packers in dubai.
ReplyDeleteDid you know there's a 12 word sentence you can speak to your man... that will induce deep feelings of love and impulsive attraction for you buried inside his heart?
ReplyDeleteThat's because hidden in these 12 words is a "secret signal" that triggers a man's impulse to love, admire and protect you with all his heart...
12 Words That Trigger A Man's Desire Instinct
This impulse is so built-in to a man's genetics that it will drive him to work harder than before to build your relationship stronger.
Matter of fact, triggering this influential impulse is absolutely important to getting the best ever relationship with your man that the instance you send your man one of these "Secret Signals"...
...You'll instantly notice him expose his mind and heart to you in a way he never experienced before and he will identify you as the one and only woman in the galaxy who has ever truly appealed to him.
We are trustworthy company of movers and packers abu dhabi Dubai that give you satisfaction service.
ReplyDeleteRC MOVERS PACKERS provide professional service of Moving and storage Dubai | Moving and storage Abu Dhabi
ReplyDeleteWe provide reliable and standard service of LG washing machine repair sharjah and Bosch washing machine repair sharjah and Ajman
ReplyDeleteMOVERS PACKERS DUBAI is the professional company of Furniture movers Abu Dhabi. We have many years of experienced in furniture movers.
ReplyDeleteSAVE YOUR HOME offering wide range of service of Ac repair service in Dubai and Air conditioning service and maintenance in Dubai and all over UAE.
ReplyDeleteIf they need to wait so that you can end packing it’s a waste of their time — which you are paying for. Don’t assume that just since you’re hiring skilled movers, objects gained’t break or become broken in the course of the shifting course of. While many professional movers definitely use warning when transferring furniture and home goods, others is probably not so careful. In addition, even the most effective movers make occasional errors when shifting heavy furniture. If you intend to rent skilled movers to handle your relocation, make sure to discover all valuation coverage and insurance coverage options.
ReplyDeletePackers and Movers in Al Baraha, Abu Dhabi, UAE
Packers and Movers in Al Baraha Village, Abu Dhabi, UAE
Packers and Movers in Al Barza, Abu Dhabi, UAE
Packers and Movers in Al Bateen, Abu Dhabi, UAE
Packers and Movers in Al Baya, Abu Dhabi, UAE
Packers and Movers in Al Dhafrah, Abu Dhabi, UAE
BUDGET CITY MOVERS is the professional movers and packers Dubai Company that give relocation service to another area or city. We have ships, planes, big trucks, and a small van to move to new locations or countries. We offer free estimates and quotes, best cost planning, and work, and you can ask about any hidden costs and surplus charges.
ReplyDeleteDubai movers
Movers in Dubai
Eagle Technical services are the best painting service provider company in Dubai. Our company is the best company for Dubai professional painter service, Professional painter dubai, Building painting service dubai, Dubai painting service, professional painting company dubai, Interior Exterior painting service dubai, painting service dubai, and Exterior painting work dubai.
ReplyDeleteImportant tips to hire best moving company in Dubai.
ReplyDeleteMovers and Packers in Bur Dubai
Movers and Packer in Dubai Marina
Dubai Movers
Movers and Packers in Marina
Movers and Packers in Bur Dubai
Movers and Packer in Dubai Marina
Dubai Movers
Movers and Packers in Marina
Movers and Packers in Bur Dubai
Movers and Packer in Dubai Marina
Combined Contracts Service Company offers electrical wiring work in Patna for both residential and commercial customers. We are fully licensed and insured for electrical services patna for your home, garage, or even your office and more. We do also the installation of every type of electrical component anywhere and where do you want. We have specialized and experienced electricians who will handle work from minor to major work.
ReplyDeleteMovers and Packers in Al Ain
ReplyDeleteI always spent my half an hour to read this weblog’s articles all the time along with a mug of coffee.
Wow Great i am in searching of this Post . You Explain the Topic Very Well . Used Furniture Buyers in Dubai
ReplyDeleteThanks And you can also know about curtains by Visit this site
Water Purifier Dubai Awesome! Its in fact remarkable post, I have got much clear idea on the topic of from this post.
ReplyDeleteThis is what I get on that page, Nice Post and Appreciated your support. Thank you so much for sharing such a detailed information. We are proud that clients hold against using our moving company.
ReplyDeleteFurniture Movers and packers like www.servicebasketuae.com/movers-and-packers-in-dubai.html make their best handling to secure the goods from all the possible effects.
www.allieddubaimovers.com
Sir Very Nice Information In Your Post Thanks . Im Reguler User Your Posts.. aquacare ae Water Filter is one of the largest distributors of products in the UAE.
ReplyDeleteOur customer service team is always ready to help you find the best filter for you. For More Information Visit. We are Water Filter Supplier
in Dubai UAE.
this is nice., bookmarked
ReplyDeletewhole house water filter
movers and packers in dubai
ReplyDeletemovers in dubai
movers and packers marina dubai
movers and packers in palm jumeirah
movers and packers in jlt
movers and packers in jbr
Free mobile and PC download games. Thousands of free Download or play free online! . Here is the Exact Arcade Version of Dig Dug!
ReplyDeleteultra compressed pc games
LEGIT FULLZ & TOOLS STORE
ReplyDeleteHello to All !
We are offering all types of tools & Fullz on discounted price.
If you are in search of anything regarding fullz, tools, tutorials, Hack Pack, etc
Feel Free to contact
***CONTACT 24/7***
**Telegram > @leadsupplier
**ICQ > 752822040
**Skype > Peeterhacks
**Wicker me > peeterhacks
"SSN LEADS/FULLZ AVAILABLE"
"TOOLS & TUTORIALS AVAILABLE FOR HACKING, SPAMMING,
CARDING, CASHOUT, CLONING, SCRIPTING ETC"
**************************************
"Fresh Spammed SSN Fullz info included"
>>SSN FULLZ with complete info
>>CC With CVV Fullz USA
>>FULLZ FOR SBA, PUA & TAX RETURN FILLING
>>USA I.D Photos Front & Back
>>High Credit Score fullz (700+ Scores)
>>DL number, Employee Details, Bank Details Included
>>Complete Premium Info with Relative Info
***************************************
COMPLETE GUIDE FOR TUTORIALS & TOOLS
"SPAMMING" "HACKING" "CARDING" "CASH OUT"
"KALI LINUX" "BLOCKCHAIN BLUE PRINTS" "SCRIPTING"
"FRAUD BIBLE"
"TOOLS & TUTORIALS LIST"
=>Ethical Hacking Ebooks, Tools & Tutorials
=>Bitcoin Hacking
=>Kali Linux
=>Fraud Bible
=>RAT
=>Keylogger & Keystroke Logger
=>Whatsapp Hacking & Hacked Version of Whatsapp
=>Facebook & Google Hacking
=>Bitcoin Flasher
=>SQL Injector
=>Premium Logs (PayPal/Amazon/Coinbase/Netflix/FedEx/Banks)
=>Bitcoin Cracker
=>SMTP Linux Root
=>Shell Scripting
=>DUMPS with pins track 1 and 2 with & without pin
=>SMTP's, Safe Socks, Rdp's brute
=>PHP mailer
=>SMS Sender & Email Blaster
=>Cpanel
=>Server I.P's & Proxies
=>Viruses & VPN's
=>HQ Email Combo (Gmail, Yahoo, Hotmail, MSN, AOL, etc.)
*Serious buyers will always welcome
*Price will be reduce in bulk order
*Discount offers will gives to serious buyers
*Hope we do a great business together
===>Contact 24/7<===
==>Telegram > @leadsupplier
==>ICQ > 752822040
==>Skype > Peeterhacks
==>Wicker me > peeterhacks
If you are looking for the best quality services of Gypsum work Dubai? then Contact Fix hub. We are here to serve you a services at low cost.
ReplyDeleteDelighted to see your blog.
ReplyDeleteFire System Repair Services in Uae
emergency lighting system supplies in UAE
it was such a wonderful post thanks man
ReplyDeleteregards Painting Services Dubai
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post!
ReplyDeleteHomeMovers In Dubai
Thanks for the awesome post I feel happy to read this post thanks for sharing this post. I constantly read the smaller articles and clarify their motives, which also happens with this article!
ReplyDeletehow many calories is in an apple
how many weeks in 3 months
how many working hours in a year
how many cups in a liter
ounces per cup
52 weeks in years
most famous person in world
3d rectangle
I really appreciate the efforts you put into reviewing these useful resources.
ReplyDeletevilla movers and packers in dubai
Hire Movers packers in Dubai on one call
ReplyDeleteSaba Movers are the best furniture movers in Al Barsha 1 neighborhood in Dubai, providing a wide range of furniture moving & transportation services all under one roof.
ReplyDeleteDubai electrical is the best company for carpentry services dubai. If you want services at low cost then contact us 0555028116.
ReplyDeleteThanks for update:
ReplyDeleteSwimming Pool Water Supply
Yes, I watch this video. This one is so amazing you make RC Arduino Traction. In hope in future you share more good updates. Now it's time to avail shutters Birmingham for more information.
ReplyDelete
ReplyDeleteNottingham Travel (UK) is a renowned name in affordable airline ticket sales. We partner with major airlines like Qatar Airways, British Airways, PIA and are expanding our services to the UAE. Additionally, we're planning an open survey with Water Purity and Drinking Water to assess private sector RO water filter machines, contributing to improving water quality standards.
#cheap flights Birmingham, #cheap flights Birmingham to Pakistan #cheap flights Nottingham, #online airline tickets
We are professional used furniture buyers in Dubai – United Arab Emirates. We buy used furniture at very competitive prices. Used furniture such as Sofa, Bed set, Cupboard, Chair and Mirror etc. We provide buying service in all towns of Dubai. This is our website to visit We will pay you in cash. Contact us for the best price in whole Dubai.
ReplyDeleteWe are professional used furniture buyers in Dubai – United Arab Emirates. We buy used furniture at very competitive prices. Used furniture such as Sofa, Bed set, Cupboard, Chair and Mirror etc. We provide buying service in all towns of Dubai. We will pay you in cash. Contact us on https://usedfurnitures.ae/ for the best price in whole Dubai.
ReplyDeleteWe are professional used furniture buyers in Dubai – United Arab Emirates. We buy used furniture at very competitive prices. Used furniture such as Sofa, Bed set, Cupboard, Chair and Mirror etc. We provide buying service in all towns of Dubai. We will pay you in cash. Contact us for the best price in whole Dubai.
ReplyDeletePest Clean, your premier choice for german cockroach control in Dubai. Specializing in targeted solutions, our expert services ensure a pest-free environment for homes and businesses. Trust Pest Clean for effective and tailored strategies, providing top-notch German Cockroach control in Dubai. Elevate your pest management with Pest Clean's reliable and professional services.
ReplyDeleteExperience seamless house shifting ajman with "SwiftMove." As top local movers in Dubai, we prioritize efficiency and care. Our skilled team ensures a stress-free relocation, providing reliable and affordable services. Trust SwiftMove for a smooth transition to your new home in Dubai, making every move a hassle-free experience.
ReplyDelete"Your post left me feeling inspired and uplifted. Thank you!" for more information visit us on
ReplyDeleteAre you looking for a Certified Ethical Hacking Course? Explore IEVISION's course offering! Gain hands-on experience and learn the latest techniques in ethical hacking. Join now to enhance your cybersecurity skills and advance your career.
ReplyDeleteIf you are search the shaving cream for your ultimate shaving experience for getting luxurious feel. Vi-johnkart is your one stop solution. Buy the best shaving cream for men at the best price.
ReplyDeleteThese local movers in Dubai, who provide home moving services, office moving services, etc, are skilled to tackle the complexities of transferring. They purpose to make transferring much less annoying and tough by streamlining the system and reduce your stress.
ReplyDeleteThank you for sharing this interesting article.
ReplyDeleteStorage and Warehousing Services in Dubai