In part 2, we’ll upload our sketch to the Arduino.
Step 1: Plugin the Arduino to the Computer
Connect the Arduino using an usb cable. Note: Disconnect the DIN cable from the Bescor before proceeding.
Open up the Arduino program and make sure the Arduino is selected on the right COM port.
Step 2: Upload the Sketch
This sketch is a work in progress and can be modified and used freely.
Updated: 4-6-2015
https://github.com/mattalford/ArduinoPanTilt/blob/master/ArduinoPanTilt.ino
Press the right arrow to upload the sketch.
Sweet and simple! Please ask any questions if I missed something.
Hi,
I’m looking at getting the Bescor and Arduino combo to do some time lapse photography. I’ve never worked with an Arduino but have programming experience, would it be possible to hard-code a program (for instance 1 step right every 2 minutes and 1 step up every 4 minutes and have it run without the nun-chuck (or possibly use the nun-chuck as a start command.) I figure a loop could do the movement with pauses I just wasn’t sure if it was possible to have the Arduino complete a program without external input. Is such a program possible? Any hints?
Yes, it’s possible. You could code it like the Arduino blink sketch.
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
void loop() {
analogWrite(right, 100);
digitalWrite(left, LOW);
delay(1000);
analogWrite(right, 0);
digitalWrite(left, LOW);
delay(1000);
}
Unfortunately, the dc motors do not have position feedback, so it’ll take some trial and error to get the right pauses and use a intervalometer.
I’m using a similar method. Is a breadboard necessary or can I connect the wires directly to the pins on the Arduino?
Yes, you can directly solder to the Arduino pins.
I’m trying to use a Arduino Micro and stuff it all inside the Nunchuck for easier transport with the MP101. Can someone help with the minor code changes. I get these errors:
sketch_jun18b.ino: In function ‘void setup()’:
sketch_jun18b:21: error: ‘TCCR2B’ was not declared in this scope
sketch_jun18b.ino: In function ‘void nunchuck_setpowerpins()’:
sketch_jun18b:35: error: ‘PORTC3’ was not declared in this scope
sketch_jun18b:35: error: ‘PORTC2’ was not declared in this scope
Thanks, Kaitein
You can delete this code because the Arduino Micro is not compatible with the Arduino Uno. The analog pins 2 & 3 can be replaced for the ground and 3.3v pins on the Micro.
TCCR2B = TCCR2B & 0b11111000 | 0x07; //Adusting PWM frequencies for testing pins 11 and 3
TCCR1B = TCCR1B & 0b11111000 | 0x05; //Pins 9 and 10
nunchuck_setpowerpins(); // use analog pins 2 & 3 as gnd & pwr (uncomment to use WiiChuck)
//To power the WiiChuck Adapter
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}
I’ll give it shot. Thanks for the quick reply and help,
Thanks Matt. It works now. I’ll send a link to a picture/vid when I get it all put together. Again thanks for helping out an Arduino newbie.
Will try your hack today)) The sketch is uploaded, waiting for the Nunchuck)
Got a nunchuk, all is working, but its difficult to do very slow pan and tilt (the reason i began to do this project) and especially combination slow of pan and tilt. With which modification of the scetch we can decrease the max speed of rotation (i’m absolutely newbie in c++, yesterday bought arduino 🙂 )
// The values used for speed
absx = abs(varx); // Convert the x-axis value to an absolute value
absy = abs(vary);
You can adjust the speed here.
Eg. absx = abs(varx*0.5); // Convert the x-axis value to an absolute value
This would half the speed.
Hi Matt,
Very interested in your work. I’ve purchased the bescor 101 for my church and the hope is that we can use arduino to possibly control the panning enough to make it not jerky. Figured it would be a learning process.
What do you think about our idea? Is it possible to slow the pan down on the bescor enough to “smoothly” pan back and forth with a speaker.
I figured that the software coding is possible but a limit would be reached with the bescor unit itself. Any thoughts?
Yes, it will be a learning process and depending on how close the camera is, about 50ft will be too jerky zoomed in. The closer the better if your subject is not moving quickly side to side.
Matt,hi, i dont speek english well,its possible with the Bescor MP-101 and Arduino move in two axis x and y in the same time?
Anyone else getting an error ‘WiiChuck’ does not name a type ?
I figured out my ‘WiiChuck’ error. Turns out that the WiiChuck library I downloaded from the Arduino site was an older version and didn’t work with my third party Wii Nunchuck.
This was a great project. I made some mods to the code to incorporate a dynamic speed control using the C and Z buttons. I use the C button to achieve 0.5x speed, the Z button gives me 1.5x speed and pushing both together resets the speed back to 1x. I tried to comment the code as best as I could. Through a lot of trial and error testing, I found these to be acceptable values. Anything greater than 1.7x speed freezes the MP-101, and I saw no discernable difference between 1.5x and 1.7x. I’ve found this speed control improves performance by allowing smoother track. Hope this is useful! Sorry for the double post, I pasted in HTML before, hopefully this is more clear.
/*
*
* This sketch controls the Bescor MP-101 Pan/Tilt system using the Wii Nunchuck
*
* Copyright (c) 2015 Matt Alford, http://www.protechy.com
* Date: April 6, 2015
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses></http:>.
* I am not responsible for any damage that may occur from the use of this software.
* Nunchuck Library http://playground.arduino.cc/Main/WiiChuckClass
*
*/
#include “Wire.h”
#include “WiiChuck.h” // The library used by the Nunchuck
#define left 11 //Pin 11 controls left pan
#define right 3 //Pin 3 controls right pan
#define up 10 //Pin 10 controls up tilt
#define down 9 //Pin 9 controls down tilt
WiiChuck chuck = WiiChuck();
int varx, vary, absx, absy, mapx, mapy, resetsum = 0;
//added an integer variable resetsum to help me detect a simultaneous button push
float speedmod = 1;
//added a variable to control speed using C and Z buttons, used in conjunction with the varx and vary variables
boolean lastZ, lastC;
//added button C and Z variables
void setup()
{
Serial.begin(115200); // Opening the serial port
TCCR2B = TCCR2B & 0b11111000 | 0x07; //Adjusting PWM frequencies for testing pins 11 and 3
TCCR1B = TCCR1B & 0b11111000 | 0x05; //Pins 9 and 10
nunchuck_setpowerpins(); // use analog pins 2 & 3 as gnd & pwr (uncomment to use WiiChuck)
chuck.begin();
chuck.update();
}
//To power the WiiChuck Adapter
static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
delay(100); // wait for things to stabilize
}
void loop() {
chuck.update(); // The Nunchuck values update in the loop
// 130 is the distance from 0 on the joystick
varx = chuck.readJoyX(); // nunchuk.analogX is the value of the x-axis
vary = chuck.readJoyY(); // nunchuk.analogY is the value of the y-axis
lastC = chuck.buttonC; // this is the boolean value of button C, 1 = pressed
lastZ = chuck.buttonZ; // this is the boolean value of button Z, 1 = pressed
// The values used for speed
absx = abs(varx*speedmod); // Convert the x-axis value to an absolute value
absy = abs(vary*speedmod);
// Map the x/y value to get the full range
mapx = map(absx, 0, 100, 0, 115);
mapy = map(absy, 0, 100, 0, 115);
//A sum of two variables to see if buttons C and Z have been pressed together
resetsum = lastC+lastZ;
//Changes speed in real time by using the C and Z buttons
//By pressing the C button, the speed is halved by changing the speedmod=0.5
if (lastC != 0)
{
speedmod = 0.5;
}
//By pressing Z, the speed is increased by 1.5X by changing speedmod=1.5
if (lastZ != 0)
{
speedmod = 1.5;
}
//reset the speedmod variable back to 1 when C and Z are pressed simultaneously, with a small delay to reset account for uneven button release time
if (resetsum == 2)
{
speedmod = 1;
delay (150);
}
// Tilt based on the input from the joystick
// I used the serial output to check the stability of these values and “tightented” the edges to make the stick more sensitive, your nunchuck may differ, so alter the vary > x according to your offsets
if (vary > 3)
{
analogWrite(up, mapy);
digitalWrite(down, LOW);
}
else if (vary < 3)
{
analogWrite(down, mapy);
digitalWrite(up, LOW);
}
// Stop tilt
else
{
analogWrite(up, LOW);
analogWrite(down, LOW);
}
// Pan based on the input from the joystick
// I used the serial output to check the stability of these values and “tightented” the edges to make the stick more sensitive, your nunchuck may differ, so alter the varx > x according to your offsets
if (varx > -4)
{
analogWrite(right, mapx);
digitalWrite(left, LOW);
}
else if (varx < -4)
{
analogWrite(left, mapx);
digitalWrite(right, LOW);
}
// Stop pan
else
{
analogWrite(right, LOW);
analogWrite(left, LOW);
}
Serial.print(chuck.readJoyX());
Serial.print(“X, “);
Serial.print(chuck.readJoyY());
Serial.print(“Y, “);
Serial.print(mapx);
Serial.print(“MapX, “);
Serial.print(mapy);
Serial.print(“MapY, “);
Serial.print(varx);
Serial.print(“varx, “);
Serial.print(vary);
Serial.print(“vary, “);
//added these variables to serial output to ensure they are working properly
Serial.print(lastC);
Serial.print(“lastC, “);
Serial.print(lastZ);
Serial.print(“lastZ, “);
Serial.print(speedmod);
Serial.print(“speedmod, “);
Serial.println();
}
Hi quarthex!
I can compile and send your code to my Arduino Uno r3.
It gives me an error include “excepts” in wichuck.h library line.
Any advice for a arduino noob?
Solved.
Was the direct copy/paste from web.
The ” symbol was not correct.
I’m adding feedback control with 3d printed gears – http://pantonvich.blogspot.com/2017/04/pan-tilt-feedback-control-for-bescor.html
Fascinating project! I’ve been looking at several tutorials to build out a remote control for the Bescor. One thing that I find all the tutorials are missing is a return to zero position. I’d love to pre-define a position as the home position for the camera. Has anyone done this before?
Same question
I haven’t done this but, it could be possible with a combination of gears around the base and a potentiometer.
Hello,
I am actually looking for a modification that makes the pan-head rotate faster (pan left/right). I use it to record youth sport events and need the rotation to be faster. Even when the slider on the control is set all the way to the fast position, there are times when it is still not fast enough to keep up with the pace of the action on the field (especially when the action is happening at a close angle to the camera).
Every modification I have found online is to actually make the speed slower (for a higher precision). But are there any modifications to make it faster?
Thanks,
ggee
I haven’t tried it myself, but you could try changing the PWM frequency.
https://playground.arduino.cc/Main/TimerPWMCheatsheet
TCCR2B = TCCR2B & 0b11111000 | 0x07; // Pins 11 and 3
TCCR1B = TCCR1B & 0b11111000 | 0x05; // Pins 9 and 10
I want to do this project but i want to control the motor with the up down left right keys of my computer is it possible for the Arduino to take input from the computer.
Yes, you can connect to the Arduino usb and use the serial port to send commands from the computer.