Fablab O Shanghai's Dishu Machine 上海数制工坊"地书"机器人
Fablab O Shanghai's
Dishu Machine
Fablab O 中国“数制”工坊即将参加2017 Maker Faire Bay Aera,其中FabAcademy全球课程Fablab O学员Russett Jtravis的“地书”项目进入2017 Maker Faire首页的轮播推荐。
Fablab O Shanghai's
Dishu Machine
Dishu Machine
Fablab O工作坊的 “ 地书 ”机器人
以上展示的是一个由上海Fablab O 制作的“地书”机器人,它可以用水在地面上完成中国古典诗词大作。看这个机器人正载着一支毛笔和水慢慢地起舞。不过得速度快点儿,书法作品很快就会消失!
Fablab O Shanghai's Dishu Machine
https://v.qq.com/txp/iframe/player.html?vid=t1316ze3s83&width=500&height=375&auto=0
RESEARCH : MACHINE PRECEDENT; DISHU
The inspiration and direction for this robot comes from Seymour Papert's LOGO "turtle".
A wonderful television expose Seymour Papert's LOGO and turtle drawing robot. If you can, I recommend listening to something like Radiohead's "Treefingers" or Mum's "Slow Bicycle" while watching the video. It helps direct your mind into the right space.
This version of the turtle is made of an acryllic base, two wheels individually driven by motors connected via timing belts, two ball bearing casters on the perpendicular axis and a sharpie marker near the center perhaps connected via a servo bracket. Data and power are provided externally via the serial cable. The previous image shows a vaccuum formed plastic globe and some additional finishing materials under the base which gives the robot character.
Design considerations for our Dishu Robot.
Simple : Easy to build
Simple : Easy to program
Capable of operating on outdoor surfaces (cracks, pebbles)
Battery powered
Working area size and characteristics
Wheels do not collide with drawing surface
Open source
Design components of our Dishu Robot.
Wheels
◎ Stepper motors for accurate motion.
◎ Balance
◦ Multiple wheels each side?
◦ Ball bearings for balance?
◎ Individually controlled for steering
◎ (advanced)Speed control for variable line thickness
Effector
◎ Stabilizer
◎ Stem diameter adjustment
◎ Water supply
◎ Permits movement of brush not to obstruct flow
◎ (advanced)Pressure sensitivity
Stage
◎ Movement
◎ Support effector
Frame
◎ Batteries
◎ PCBs
◎ Water
Code
◎ Drawing translation computer langauge
◎ XYZ directives?
◎ Code to wheel,a
◎ Code to wheel,b
◎ Code to stage
◎ Code to effector
(advanced)Collision detection sensors
Thoughts on uses.
I think this type of robot could be used for many useful things beyond Dishu. For instance, the robot could draw permanent artistic patterns on floors in paints or inks. It could draw patterns on large stock material for various uses such as construction. Maybe the robot does not use a pen and is instead equipped with a knife for large scale cuttingp applications; maybe it cuts patterns of mega-origami. That could be fun.
Gears driven by motors. One gear to move the brush holder along an axis and another to move the assembly along the perpendicular axis ala the Itty Bitty Drawing Robot.This could be used to move the brush one one axis independent of the movement of the wheels on another axis.
A Gestalt stage, developed by Nadya Peek and James Coleman, used for motion in one direction, while something else, wheels or legs, freely move the robot in the perpendicular direction.
This fabricatable machine by Jens Dyvik with the linear rails, rack, pinion and glide blocks all fabricatable on conventional CNC milling machines. Fantastic.
Motors attached directly to wheels. Rubber is added around the outside face of the wheel.
Or motors attached to belts attached to wheels. I think this option might make operation less efficient but looks better. Also, The motor could be positioned with greater freedom in relation to the wheel, whereas the previous option requires the motor to be centered on the wheel. This seems to be the technique used in the LOGO "turtle".
Further, this could be a motorized gear connected to two wheels on each side for balancing the machine. This diagram from this gear train design blogpost displays a [stepper] motorized gear driving two wheels.
Carmen found this drawbot archetype, 3&Dbot, uses two pairs of wheels oriented to perpendicular axes. Omni-directional wheels are used to permit full motion.
Carmen found this similar execution of splitting the brush and movement axes.However, this robot moves the paper instead of the machine. Our robot is intended to move itself.
Theo Jensen inspired walking legs. Which, by the way, is infinitely more dynamic and sensational than wheels! Can the movement be discretely controlled by stepper motors? To what increment?
Carmen found this diagram of a large-scale cable camera movement system from a blog entry. One possibility would be to post a tent like structure, connect these cables, and then execute the drawings.
Often considered the first of the hanging wall drawing machine type, Hektor is a machine consisting of two motors, toothed belts and a spray can holder. It is controlled by a software written in Scriptographer running inside of Adobe Illustrator. From the Hektor webpost, "A geometric path-finding algorithm calculates the motion paths required by the fragile mechanical installation to move smoothly and not lose the battle against gravity. The algorithm then translates these paths into rotations of the two stepper motors that position the spray-can, and coordinates the pressing of its nozzle." Between the stadium scale of the Camera's Cradle to the wall scale of Hektor, could a robot draw on a floor surface using a tension system and be mobile with legs or wheels?
About the brush holder and effector.
The simplest most widely used variant seems to involve a micro-server that pushes on a sleeve (wrapped around the brush handle) to move the brush onto and away from the surface through an extruded rail. These images are from the Low-cost, Arduino-compatible drawing robot post on instructables. I think one improvement on this design would be to flip the direction of the sleeve so it slides into the rail. This way the two can be calibrated together to help minimize jiggle, while the sleeve is adjustable to multiple brush sizes.
This is a more elegant solution to brush movement found in the "Polar Plotter on Arduino and MakerBeams" project found by Carmen. In this case, the servo has two positions up and down. Could it be modified for pressure variants?
Watercolor Bot has an effector that uses two stressed plastic planes in combination with a servo motor and an adjustable collar (screw). The stress in the plastic helps keep the brush in constant contact with the paper and is located very near the crossing point of the X,Y axes (0,0).
FabAcademy student Keith Tan designed an adjustable end effector with a spring. Rubberbands would also be used.
And finally the overkill solution. The entire armature of the Interactive Robotic Painting Machine moves up and down along the vertical axis (relative to drawing plane). This is certainly capable of pressure variance.
FABRICATING A GESTALT STAGE
After much intense strategic consternation, we decided to begin our project by developing through the Gestalt framework. The framework is developed; we are beginners. Can we connect rotary stages on either side of a linear stage equipped with a brush effector ?
The first step is to fabricate a linear stage. Download the Rhinoceros file and you may need the grasshopper file as well. I had a problem opening the grasshopper file on my MacOS. After opening the file on a recent Windows build and saving it, it is now MacOS ready. I will include this version of the file in my links. Use with caution, while it appears to be in working condition, the graph is thick and I did not double check everything. I had 5mm thick cardboard on hand, so the material thickness was updated to this specification (Gestalt file is formatted in inches). Bake the Frame, Platform and Supports. Do some linework cleanup. Export the file to your laser cut format. If you have 5mm thick cardboard, save yourself some time and use my SVG linked below.
A rounded 813mm x 830mm without padding.
I had to use a laser cutter from another lab because the biggest piece exceeded our lasercut bed. I rushed optimizing the settings, due to a security guard trying to close shop. That decision lit a small fire that ruined a some pieces. Remember, poor decisions do not make pretty things.
Score: speed55, powerMin80, powerMax85
Cut: speed10, powerMin100, powerMax100
Cancelled that job. Increased the speed of the laser movement, reoriented the origin and started again. This time no fires and the pieces were mostly cut. Some pieces did not cut all the way through, maybe due to warping. In the future, I might consider cutting along the same lines twice with a combination of less power and greater speed. The settings I used:
Score: speed60, powerMin80, powerMax85
Cut: speed20, powerMin95, powerMax100
With a boxcutter, I liberated the unfolded Gestalt Stage. Tomorrow I will assemble.
Constructing a Linear Gestalt Stage was fairly straightforward. There were a couple issues which I think may have been related to the 5mm cardboard thickness I used and how the Grasshopper graph accounts for that. I did not encounter any problems that required me to re-cut any of the pieces. First issue, these two holes were not cut on the end of the main piece. The holes are necessary for sliding in the rails. Glad I caught this before I folded the frame.
In the inner stage structure, there is not enough space for the piece that grabs the threaded rod attached to the motor. This would be less of an issue if that piece was positioned to the outside, but the cardboard would still need some trimming around the bolt heads.
This looks like a face.
In the frame, the stage was out of alignment with the aluminum shafts and leadscrew. There was too much cardboard. I trimmed off the last flap on the frame and some material off the bottom side of the stage.
If I need to fabricate more of this Gestalt module with 5mm cardboard, I can quickly adjust the pattern file to pickup these sizing mods. Regardless, everything is ready to be motorized with this piece of our robot mockup.
To help with visualizing the other components of the machine, I added low-tech wheels and an end effector. At least it is humorous.
And I tested the movement of the stage using the motor attached to a Gestalt hub and python. While it worked, it was extremely finicky: the motor would become unresponsive after running the script a few times. After, if I disconnected everything and reconnected, it would work again. Plus, we were unable to network multiple nodes.
Update: With the linear stage working, I went to work constructing wheel armatures. Looking at the length of the screw attached to the motor driving the stage, we thought it would not permit a wide enough range of motion on that axis. Therefore, in addition to providing for wheels and motors, I built in attachements for a motor facing forward that could drive a toothed belt to move the stage.
I returned to the rhinoceros file and rearranged some of the elements of the linear stage into a foldable armature using the same 5mm cardboard.
I incorrectly accounted for material thickness in the folds of the inside layer. Fortunately, cutting with the laser cutter is quick. I added the extra width to all the modules within the fold and recut.
Everything fit together tightly without need for extra adhesives.
I was anxious to get some kind of testable prototype together for wheels connected to motors before I ended the evening, so I thought a quick solution would be to connect the wheel directly to the motor shaft. This turned out to be more troublesome than expected for a couple of reasons. First, I did not do a kerf test because I thought after cutting one test, I would be able to adjust the dimensions. Ultimately, I was forced to cut many tests. I used 4mm acrylic and cooling after cutting with the laser can change the material size enough to throw off a good fit. Further, the material wears loose after only a few uses. A far easier solution would have been to use a metal connection on the pin which could be screwed in through the face of the wheel. Then the screw holes in the acrylic would not need to be perfect and with the connections spread across multiple points, the connection would retain its fit longer. Nonethelss, for purposes of testing the wheel movement these wheels worked.
I added some multidirectional wheels to to help the machine balance. We hope that the machine will be able to turn and thought to make the wheels on the center of the linear axis. Not a great idea for balance. This caster is not great either.
Carmen printed an effector from a previous OpenDot project. While it will need some adjustment for our machine, it is helpful to at least go through some fabrication and see how one works in our hand.
ZhaoWei returned to the lab, wired the motors and tested its operation. He used an Arduino Mega 2560 with a RAMPS shield running GRBL. I will comment more on the programming in another section of this post. All the motors, two for the wheels, one for the stage, one for the effector movement and another for pumping water through the brush are working.
https://v.qq.com/txp/iframe/player.html?vid=q1317uq60op&width=500&height=375&auto=0
The machine does not balance well, so the next thing I will focus on is improve the wheel mechanics.
I will post links to resources I have found helpful here.
[m]MTM : Modular Machines that Make : Cardboard CNC.
pyGestalt Github : The goods.
[modular] Machines that make : More Gestalt information.
OpenDot Effector, 2015 : Work by Simone Boasso printed for our prototype.
DISHUBOT: PROTOTYPING THE INFINITY AXIS.
Now we have an operational prototype. Now we have a barely operational prototype. We decided I would focus on the mechanics of the second prototype. I wanted to improve several aspects of the first prototype. One, the robot should be easily portable, which I think works best if it can be easily dissambled and assembled. Two, the wheels do not balance the robot. Three, the effector and stage should be customized to the dimensions and requirements of this robot.
In this section I will focus on the wheels, or the (Y) axis, the infinity axis.
I thought it would be interesting if the metal rods were freed from the cardboard frame, enabling them to be any length, perhaps even variable depending on circumstance. Instead of using a screw to drive motion on that axis (X), we could use a toothed belt, which may easily be adjusted for length. The wheels needed to be detached from the motor and repositioned for balance. I thought we could use two pieces of material sandwiching the wheels and a belt to translate motor movement to the wheels. The belt would also protect the wheels from wear and give greater friction. Finally the stage needed an element to grip and tighten the open end of the belt and an effector for the brush. The brushes we have are large enough to run a tube down the center of the stem, so maybe it makes sense to increase the diameter of the verticle guide. For future flexibility, this entire effector armature may be detached from the stage and replaced with either an improved version of itself, or something with a different use. With this in mind, I made this freeform sketch in Rhinoceros. Completely out-of-scale and interrelationships, but it proved to be a helpful reference through the next few steps of fabrication.
So how about more Grasshopper practice? I can make one hell of a mess in this grasshopper graph. In the future, I will have to explore best practices in keeping the grasshopper graph organized. Fortunately, I can read it and this script made tweaking the wheel armature through prototyping significantly easier. I started with two wheels, the motor with a pulley attached to its shaft, and a single bearing between the wheels. After thinking ahead a little to positioning the motor for the X axis, I decided to move the wheel motor below the rods. When doing so, we were concerned for the tightness of the belt to the motor's gear so I added two more bearings between the wheels and motor.
Over to the lasercutter and minutes later I had a working version in cardboard.
Unfortunately, we did not have bearings or closed toothed belts in stock. To the streets of Shanghai where dreams can be bought on the cheap.
With a fresh batch of parts, I returned to the lab and the cardboard prototype and put everything together. I love it when this happens.
Now I need teeth in the wheels to better catch the belt. I found this grasshopper gear maker referenced in Moritz Begle's FAB aacademy page. What better point of reference than a FAB academy page? Use a gear maker in grasshopper to cut wheels. There are many tools included in that package. I only needed the gear tool. I used a little maths to find the circumference of the circle for the number of teeth on the gear. My purchased belt had a 5mm pitch. I had to cut a couple test wheels to calibrate for laser kerf.
With properly coordinated gear wheels, I returned to my cardboard armature and tested. Brilliant.
https://v.qq.com/txp/iframe/player.html?vid=g1317c4aa3y&width=500&height=375&auto=0
Finally, I wanted to use stiffer material than cardboard for this armature, so I went to the acrylic stock I was using for the wheels. The material is far less forgiving than cardboard, so I needed to adjust the bottom middle bearing location to relieve belt tension. I did this first on the drill press and then translated my findings into grasshopper and back out to the lasercutter.
Finally, I wanted to use stiffer material than cardboard for this armature, so I went to the acrylic stock I was using for the wheels. The material is far less forgiving than cardboard, so I needed to adjust the bottom middle bearing location to relieve belt tension. I did this first on the drill press and then translated my findings into grasshopper and back out to the lasercutter.
There are some [mechanically] viable wheel armatures. By this point I had already begun sketching a piece to hold the rods and motor for the perpindicular axis which I will document in the following section of the page. The joints cut into the top of the wheel armature were made to slot into this next piece. Because I was working quickly, I made some decisions and followed through on that next piece. I decided this armature will slot in and the rod will help pin it in place for extra structure. And I added holes facing the motor screws on the opposite wall so I could unscrew or tighten without dismantling the entire armature.
A few final notes on this build. The lasercutter makes a mess on the bottom side of the acrylic. So I oriented my cut files so the messy side would be the inside side of the armature. Also, there seems to be a balance of when to remove the acrylic from the stock after cutting. Too fast, and it is horrific smelling. Too slow and it seems to lightly bond back together.
I will post links to resources I have found helpful here.
Evolvent & Gears : Grasshopper gear script I used.
Grasshopper gear script : Another gear script I tried but did not like as much. This is better in that it is clear what is going into making the gear.
Grasshopper Gear simulator : I thought this would be interesting to try but never had time throughout this build.
How to read a screw thread callout : Because sometimes we are doe-eyed beginners.
Generic Step Motor Datasheet : The basic dimensions of these motors are all very similar, and my specific steppers I had a hell of a time finding datasheets, so I used this to build a virtual reference model.
CNC Tank : Youtube design that inspired the wheel design.
DISHUBOT: PROTOTYPING THE VARIABLE AXIS.
The Gestalt linear stage used a screw drive mechanic which we thought would be too limiting dimensionally for our purposes. Therefore, we decided to change this axis to a belt drive mechanic. I also wanted to see if this axis could be freed from the cardboard structure of the Gestalt model so it might have interchangeable rod lengths.
I went about designing these pieces thinking three-d printing would be the optimal method because I could make non-planar things without worrying about connections and alignments. Three-d printing is slow. Three-d printing, however, is also passive which lets me focus on other things while the machines are working (designing the wheel armature and effector). These sections are not organized based on time.
My design was a modification of the gestalt stage, stripping away unnecessary parts and slotting connections for my wheel armature, stepper to drive the (x) axis and DC water pump. That in mind, the design of the first piece was straightforward.
Keep in mind, 3d printing can sometimes take hours to produce a single piece. You better test critical parts of the print first. By testing the rod fit, I found the printer was adding 0.4mm of material with my settings. Rather than try to properly calibrate my settings to the printer, I decided to adjust my 3D model. This is an easier thing for me to control.
Then I printed the first piece. I printed this piece with Makerbot tough PLA and a 0.2mm layer height, 3 layers on the external surfaces and 20% infill. Along with the overall wall thicknesses, the layer height was overkill and made this an 8 hour print when it easily could have been far less. In fact, with future pieces, I used 0.3mm layer height and the prints of similar size were finished in under four hours.
I made an assumption about how much space I would need for the wheels inside the two layers of acrylic before I purchased materials. Happily, I was correct. These photos were taken before I resolved the wheel belt tensioning issue.
On the other side I made an M8 sized hole for a TBD belt bearing and made space for the water pump and wires. I also added expansion slots for a water shelf and zip ties.
I printed this with the Smart Extruder+ and normal PLA at 0.3mm layer height. Much quicker and no noticeable structural negative.
Finally for the stage, I started to think about ways to carve away unnecessary material and give the robot some style. I used a U-shaped channel to tighten the belt and deal with the slack. It works but it is tricky to push the belt into place with tension. I think on another try I may make it something like S-shaped, so I can tighten the belt, hold it in place and then put it into a teethed section. Or, how about this? I might look for great ideas already in use.
I test printed the belt and rod bearing fits. Initially I had teeth going all the way around the belt fitting. It was overkill. Glad I tested first.
And the final fit of the belt tensioner.
The robot is coming together.
视频10
I will post links to resources I have found helpful here.
4xiDraw drawing machine : A machine I checked out while making.
28BYJ-48 Step Motor Axis : A machine I checked out while making.
DISHUBOT: PROTOTYPING HIS INSTRUMENT.
The effector pushes the brush into the drawing surface and pulls it away. Included in the mechanism is the flow of water from the reservoir into the brush tip. This design uses a 2BBYJ-48 stepper motor we had in stock in the lab. Precision of movement is not needed.
In the design of the stage, I left some gaps that could be used to attach an effector shield. We also looked at an effector designed by Simone Boassopreviously. With these starting points, I designed this:
I created a larger guide for the vertical movement with a perpindicular axis for slide for alignment. Further, the center is hollow for the water tube and the end is customized for our brush. And the gaps are adjustments for wiggle and printer calibration.
By this point, my 3D printing game was on point. This piece was a breeze.
视频11
Brushes can easily be swapped out or have a new stem printed to adjust for length and thickness. Alternate shields can also easily be swapped into place. With that, the whole is together. Next I need to return to Arduino and GRBL...
I will post links to resources I have found helpful here.
BYJ48 Stepper Motor : Instructable post about the effector stepper.
28BYJ-48-5V Stepper Motor Datasheet : Datasheet.
Customizable Wheel for 28BYJ-48 stepper motor : A better gear connection.
OpenDot Effector, 2015 : Work by Simone Boasso printed for our prototype.
CUSTOM G-CODE, WHY AND HOW.
When writing Chinese characters, there are rules. You can either abide or you will be labeled a fraud. When we first tested the machine, we tried several online g-code generators (link?). One thing we did not find was a good way to specify stroke ordering and directionality. I was excited to show some Chinese people the first successful tests of our machine and everyone criticized the machine's stroke order!
I started to investigate the possibility to write code we could use to generate g-code which follows the basic principals for patterning strokes in Chinese characters. And, this was a good excuse, as the thought of being able to control g-code throughput has intrigued me since three-d printing a couple months ago. Throughout the past couple months, I have had fun learning the Grasshopper plugin to Rhinoceros so I decided to start with Jens Dyvik's Bark Beetle - parametric toolpath plugin for Grasshopper. Unfortunately, there is a plugin compatibility issue I could not solve with Firefly on MacOS and the graph was out of my comprehension level. I will return to it soon.
Searching around I found two fantastic webposts. This instructable: Make Awesome 3D Geometry by Programming CNC-code by Siemenc and G-Code Writer for 2D Shape Milling. The latter was mostly outdated through Grasshopper updates but the concepts Andy Payne (same person behind Firefly) discusses in the video are still relevant; I ultimately built systems based on these concepts. I started with Siemenc's open-source grasshopper code for controlling shopbots, only slightly outdated, and adapted it to our purposes.
视频12
There are a limited number of basic strokes which compose all Chinese characters. Some systems of identification find up to 37 different strokes, while others have distilled it down to just eight. It might be interesting to optimally code brush movement for each of the eight basic strokes in modules then map configurations according to desired character output. This Chinese character "Yong" meaning "permanence" is often used to teach the eight basic strokes (because they are all present). I foresee one problem in that simply using this approach might output characters that are too "machined". Perhaps there is a secondary set of rules that create unique distortions based on stroke proximities, ie water/ ink saturation points, momentum, or even emotional content of what is being written.
I will post links to resources I have found helpful here.
G-code Wiki!! - Do not screw around, this is your number one resource for writing g-code.
Stroke Order for Chinese Characters : Background for Chinese handwriting.
The Importance of Strokes in Chinese Characters : Background of the eight basic strokes that compose most Chinese characters.
Relative vs Absolute Coordinates : An explanation of use cases for each in writing g-code.
Treesloth : Advanced set of tools for managing Grasshopper lists.
Grasshopper list searching : Index searches require an exact match of all components within an indexed item while Member index searches work simply on values.
如需了解更多,请扫下方二维码。
更多精彩内容
FABO Academy X |中国“智造学术X” 第5期开始接受报名
"探索未来"——2017 FABO美国高科技MIT游学夏令营
往期内容回顾
同济附属实验学校FABO Playground中国“数制”乐园揭幕
上海市同济黄埔创新高中招生会, Fablab O l 中国“数制”工坊丁峻峰老师为学校的STEAM教育推波助澜
2017“顶思会+Fablab O”STEAM教育论坛及工作坊经典回顾
Fablab O携手Stratasys诚邀您参加3D打印教育研讨会
Fablab O - "数制"工坊
自中国第一个“数制”工坊开放实验室- Fablab O同济创办以来,FABO立足建立国内创新生态圈,把各个学校、企业和社区的公共平台链接起来,对接国内外优良资源、资本,促进中国创新和创意的市场转化,助力新一轮的互联网和智能自造的创业浪潮。在过去两年里FABO举办了包括100多期跨学科的开放夜;50多期软硬件工作坊;可穿戴、参数化暑期学校,承办了2014,2015,2016教育部中美青年创客大赛上海选拔赛、2015科技部浦江创新论坛-创客和社会革新文化论坛、2016海峡两岸青年创客大赛,2015中日韩智能可穿戴大赛,孵化10几个创新项目。目前除了 Fablab O 上海的同济大学和浦东实验室以外, Fablab O -Shenzhen “数制”工坊深圳站于2015年6月落户深圳龙岗中心区, Fablab O -Suzhou “数制”工坊苏州站于2015年10月落户高新区。
Asthe first built fablab in mainland China, FABO undertakesthree missions: community construction (FABO C), education (FABO U) andentrepreneurship (FABO I). FABO is based on the establishment ofnationalinnovation ecosystem, trying to link public platform in schools,businesses andcommunities, dock excellent domestic and foreign resources,ventral capital,and promote innovation and creativity into the market, help newround wave ofinnovation and entrepreneurship in China. In the past two years,FABO has held over 100 interdisciplinary open-nights, more than 50 workshopstopics on open softwareand hardware, and has hosted US-China Youth MakerContest three times, Intelligent Wearable Contest among China, Japan and Koreaonce, PUJIANG INNOVATION FORUM 2015, besides, has also hatched adozeninnovative projects. Currently apart from Fablab O Shanghai, Fablab O -Shenzhenwas settled in Shenzhen Longong District in June 2015 and also FablabO - Suzhousettledin Suzhou New District in October 2015.