Theres many student ask me how to control more than 1 Arduino's PWM pin using Visual Basic/Android App to control their project.
Okay today i will show you a trick how to control Arduino's PWM pins.
What is Pulse Width Modulation (PWM) ? Here a pic to explain PWM.
Check out this video how to coding:
https://www.youtube.com/watch?v=U45pEQSm0-0
Download APK and Arduino code that i use in my video :)
1. APK = https://drive.google.com/open?id=0B3c_VPBO9Qq3dF9IdVh0X2kxWmc
2. AIA = https://drive.google.com/open?id=0B3c_VPBO9Qq3M01VUm9GYnJCbzA
3. Arduino Code = https://drive.google.com/open?id=0B3c_VPBO9Qq3TTE1bW9mUG1nLTQ
Actually i use a "String" function in Arduino IDE examples to create this program.
here:
This is my Arduino Sketch.
First i create a new string with name "fromAndroid".
and in void loop i start to analyse the string that i've send from android.
look at this:
if(Serial.available() > 0)
{
fromAndroid = Serial.readString();
if(fromAndroid.startsWith("pwm3"))
{
fromAndroid.replace("pwm3", "");
analogWrite(pwm3, fromAndroid.toInt());
Serial.print("PWM3 VALUE: ");
Serial.println(fromAndroid);
}
if(Serial.available() > 0)
- i check if any string receive from android
fromAndroid = Serial.readString();
- if string is available, arduino will start read.
if(fromAndroid.startsWith("pwm3"))
- then i check in string its start with what character. if in string is "pwm3255" its means at pin pwm3 the value is 255.
fromAndroid.replace("pwm3", "");
-in Arduino we cannot write directly like this analogWrite(pin, pwm3 255). Because in the argument we only can write an integer or number. So we need to remove some character in the string. In this case, i have string with pwm3255 and i want to remove this "pwm3" to make sure i have only integer/number in my string.
i use this function that called string replacement.
stringName.replace("things want to replace" , "replace with what you want")
fromAndroid.replace("pwm3", " ");
i leave the second argument with space to erase the "pwm3"
Now the replacement is done! now we have "255" in the string :D
analogWrite(pwm3, fromAndroid.toInt());
-After replacement in string only have "255". As we know, to use analogWrite function we only can use integer or number only in the first or second argument. We cannot use char, string, or anything! only integer. Now what should i do, i use this function string.toInt() to convert from string to integer! in our string now is "255" so just convert it directly by using this function. Just write like this:
analogWrite(pwm pin thats we want to write with , the string that we want to convert to integer);
analogWrite(pwm3, fromAndroid.toInt());
in first argument is PWM pin that we want to use, in second argument is the string we want to convert.
Okay lets see this another example:
if in string or android sends "pwm5150" its means we want to write value at pin PWM 5 is 150.
first analyse the the string using fromAndroid.startWith("pwm5")
then use replace function to erase the "pwm5" like this fromAndroid.replace("pwm5", "");
and change the string to integer using .toInt() function analogWrite(pwm5, fromAndroid.toInt());
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////{
fromAndroid = Serial.readString();
if(fromAndroid.startsWith("pwm3"))
{
fromAndroid.replace("pwm3", "");
analogWrite(pwm3, fromAndroid.toInt());
Serial.print("PWM3 VALUE: ");
Serial.println(fromAndroid);
}
let me explain this code.
if(Serial.available() > 0)
- i check if any string receive from android
fromAndroid = Serial.readString();
- if string is available, arduino will start read.
if(fromAndroid.startsWith("pwm3"))
- then i check in string its start with what character. if in string is "pwm3255" its means at pin pwm3 the value is 255.
fromAndroid.replace("pwm3", "");
-in Arduino we cannot write directly like this analogWrite(pin, pwm3 255). Because in the argument we only can write an integer or number. So we need to remove some character in the string. In this case, i have string with pwm3255 and i want to remove this "pwm3" to make sure i have only integer/number in my string.
i use this function that called string replacement.
stringName.replace("things want to replace" , "replace with what you want")
fromAndroid.replace("pwm3", " ");
i leave the second argument with space to erase the "pwm3"
Now the replacement is done! now we have "255" in the string :D
analogWrite(pwm3, fromAndroid.toInt());
-After replacement in string only have "255". As we know, to use analogWrite function we only can use integer or number only in the first or second argument. We cannot use char, string, or anything! only integer. Now what should i do, i use this function string.toInt() to convert from string to integer! in our string now is "255" so just convert it directly by using this function. Just write like this:
analogWrite(pwm pin thats we want to write with , the string that we want to convert to integer);
analogWrite(pwm3, fromAndroid.toInt());
in first argument is PWM pin that we want to use, in second argument is the string we want to convert.
Okay lets see this another example:
if in string or android sends "pwm5150" its means we want to write value at pin PWM 5 is 150.
first analyse the the string using fromAndroid.startWith("pwm5")
then use replace function to erase the "pwm5" like this fromAndroid.replace("pwm5", "");
and change the string to integer using .toInt() function analogWrite(pwm5, fromAndroid.toInt());
Here code i've write and use in my video.
String fromAndroid;
int pwm3 = 3;
int pwm5 = 5;
int pwm6 = 6;
int pwm9 = 9;
int pwm10 = 10;
int pwm11 = 11;
void setup() {
Serial.begin(9600);
Serial.println("Program Start..");
pinMode(pwm3, OUTPUT);
pinMode(pwm5, OUTPUT);
pinMode(pwm6, OUTPUT);
pinMode(pwm9, OUTPUT);
pinMode(pwm10, OUTPUT);
pinMode(pwm11, OUTPUT);
}
void loop() {
if(Serial.available() > 0)
{
fromAndroid = Serial.readString();
if(fromAndroid.startsWith("pwm3"))
{
fromAndroid.replace("pwm3", "");
analogWrite(pwm3, fromAndroid.toInt());
Serial.print("PWM3 VALUE: ");
Serial.println(fromAndroid);
}
if(fromAndroid.startsWith("pwm5"))
{
fromAndroid.replace("pwm5", "");
analogWrite(pwm5, fromAndroid.toInt());
Serial.print("PWM5 VALUE: ");
Serial.println(fromAndroid);
}
if(fromAndroid.startsWith("pwm6"))
{
fromAndroid.replace("pwm6", "");
analogWrite(pwm6, fromAndroid.toInt());
Serial.print("PWM6 VALUE: ");
Serial.println(fromAndroid);
}
if(fromAndroid.startsWith("pwm9"))
{
fromAndroid.replace("pwm9", "");
analogWrite(pwm9, fromAndroid.toInt());
Serial.print("PWM9 VALUE: ");
Serial.println(fromAndroid);
}
if(fromAndroid.startsWith("pwm10"))
{
fromAndroid.replace("pwm10", "");
analogWrite(pwm10, fromAndroid.toInt());
Serial.print("PWM10 VALUE: ");
Serial.println(fromAndroid);
}
if(fromAndroid.startsWith("pwm11"))
{
fromAndroid.replace("pwm11", "");
analogWrite(pwm11, fromAndroid.toInt());
Serial.print("PWM11 VALUE: ");
Serial.println(fromAndroid);
}
}//closing bracket for serial
}//closing bracket for void loop
Download Link:
1. APK = https://drive.google.com/open?id=0B3c_VPBO9Qq3dF9IdVh0X2kxWmc
2. AIA = https://drive.google.com/open?id=0B3c_VPBO9Qq3M01VUm9GYnJCbzA
3. Arduino Code = https://drive.google.com/open?id=0B3c_VPBO9Qq3TTE1bW9mUG1nLTQ
Hi,
ReplyDeleteGreat project but I have an issue when you slide the slider the arduino gets all the values from the application and they are all in a single line, how can it send the value in a separate line for each value?
Regards,