Teleworking is as common in the tech sector as the problems that accompany it. The physical separation and long periods of time between contact often result in significant wasted time. Wasted time in everything from warming up, to repeating explanations, to re-synchronizing efforts. A large organization may be able to navigate these issues by structuring their teams so that components of a project can be handled in multiple locations with well defined touch points and time periods, but this can be anywhere from frustrating to unworkable for a startup.
The theory was that the next best thing to having our colleague, Rudy, in our office, was having an open video line to him all day, effectively putting him in the office. We needed to test this idea to see if had any merit. We configured a spare laptop that was lying around, initiated a video chat, and placed it on a desk for a week.
The change in productivity was obvious to us even before the end of the first day. From our observation it was apparent that our conversational flow was no longer jilted or deflated by having to initiate a conference on the fly. More importantly, there were times where inertia or laziness prevented that call from being made. This was no longer an issue. Duplicate meetings weren’t happening anymore. Most crucially, Rudy was always a part of on-the-fly decision making, rather than simply being informed on the occasion that decisions had to be made quickly. Ultimately, this open channel improved the sociability of our work force. It’s a fact that your team is going to work better if there is a good bond between them. That’s not really an issue when you sit a few feet away from them, but much more challenging when communication is staggered, scheduled and strictly task oriented.
We let the experiment run to an end and were convinced we had our solution. We even had a few ideas on how to improve the experience. The biggest issue was his restricted field of view. We were constantly having to roll in front of the camera to have an interaction. We wanted to give Rudy the ability to rotate the laptop to whomever he was chatting with. This problem lent itself to a fairly simple solution that we thought we could put together rather quickly with an Arduino, a servo motor, a rotating platform, and a simple server that bridged communication between a serial port and TCP/IP port.
Tools List
Method
12. Now attach your servo's signal pin to the Arduino board using digital IO pin #9. Jumper the V+ pin on the servo to the 5v pin on the Arduino. Lastly, attach the GND pins of the servo to the Arduino. You can now use a serial communications program like minicom to connect to your Arduino and issue angles as commands. As you can see in the code above, the baud rate is set to 115200, so make sure you adjust your serial parameters to match this.
13. The last step to make this remotely accessible was to use a python script that bridges a serial port to a TCP/IP socket. You can download that here. Executing it with the arguments below would most likely work for you. Replace XXXX with the path to your usb serial device and YYYY with the port you want the server to listen on.
Tools List
- Drill
- 7/8" Drill Bit
- 3/4" Hole Saw
- Chisel
- Scroll/Jig/Table Saw
- Screwdriver
- Square
- Pencil
- Vernier Caliper
Materials List
- USB Cable (for powering Arduino+Servo)
- 2'x2' 1/2" MDF
- Arduino UNO
- Hobby Servo Motor (with a stall torque of 5.2kg*cm or more @ 5v)
- Plastic Circular Arm (included with servo or purchased separately)
- 3x Jumper Wires
- 1" piece of solid wood
- Balls Bearing Swivel (sourced from Home Depot)
- Wood Glue
- Finishing Nails
- #6-3/4" Wood Screws
Method
11. Plug your Arduino in to your PC and upload the following code:
#include <Servo.h> #define MAX_CHAR 4 Servo servo; char angle[MAX_CHAR]; char* p = angle; int alen = 0; int myatoi(const char *s, int *value) { if ( s != NULL && *s != '\0' && value != NULL ) { char *endptr = (char*)s; *value = (int)strtol(s, &endptr, 10); if ( *endptr == '\0' ) return 1; } return 0; /* failed to convert string to integer */ } void setup() { Serial.begin(115200); servo.attach(9); memset(angle, '\0', MAX_CHAR); } void loop() { if (Serial.available() > 0) { char c = NULL; while ((c = Serial.read()) >= 0) { if ( c == '\r' || c == '\n' ) { int incr = 1; int newpos; int pos = servo.read(); // Check to make sure the input is all ints if (!myatoi(angle, &newpos)) Serial.println("Error: Bad input"); else if (newpos >= 0 && newpos <=180) { // Seal off the string *p = NULL; Serial.println("Input angle: " + String(angle)); if ((newpos - pos) > 0) incr = 1; else if ((newpos - pos) < 0) incr = -1; for(int ipos = servo.read(); ipos != newpos; ipos += incr) { servo.write(ipos); delay(30); } } else Serial.println("Error: Bad angle"); } else { if (alen == MAX_CHAR-1) Serial.println("Error: Angle more than 3 bytes"); else { *p++ = c; alen++; continue; } } // Reset our string p = angle; memset(angle, '\0', MAX_CHAR); alen = 0; // Chuck anything after a newline/cr Serial.flush(); Serial.println("OK: Good to go"); } } }
12. Now attach your servo's signal pin to the Arduino board using digital IO pin #9. Jumper the V+ pin on the servo to the 5v pin on the Arduino. Lastly, attach the GND pins of the servo to the Arduino. You can now use a serial communications program like minicom to connect to your Arduino and issue angles as commands. As you can see in the code above, the baud rate is set to 115200, so make sure you adjust your serial parameters to match this.
13. The last step to make this remotely accessible was to use a python script that bridges a serial port to a TCP/IP socket. You can download that here. Executing it with the arguments below would most likely work for you. Replace XXXX with the path to your usb serial device and YYYY with the port you want the server to listen on.
./tcp_serial_redirect.py -b 115200 -p /dev/XXXX -P YYYY












