Hallo und herzlich willkommen zu meinem bisher umfangreichsten Do-It-Yourself Projekt. Ich hatte letztes Jahr einen Kamera-Slider von Neewer getestet und dort erwähnt, das ich diesen motorisieren möchte. Daran habe ich die letzten Monate nebenher gearbeitet und heute zeige ich euch ausführlich, im Detail, wie ich das gemacht habe.
Am Ende des Projekts ergibt sich dann ein motorisierter Slider mit programmierbarem Touch-Display mit dem wir automatische oder manuelle Kamerafahrten in allen möglichen Geschwindigkeiten durchführen können. Eine Zeitrafferfunktion gibt es auch. Außerdem ist es möglich eigene Programme aufzuspielen, da ich einen Arduino zur Steuerung verwenden werde.
Ich werde jetzt strukturiert auf alles eingehen. Zuerst das Material, dann der Schaltplan bzw. die Verkabelung, nötige Modifikationen am Slider und zu guter Letzt habe ich noch ein Gehäuse für die Elektronik auf meinem 3D-Drucker gedruckt, welches ich in Blender gebaut habe. Die Blender Datei habe ich auch auf Thingiverse hochgeladen (Link). Zu allererst hatte ich ein Gehäuse aus einer alten Schachtel gebaut, was aber nicht so toll aussah. Wer also keinen 3D-Drucker hat kann das auch so machen.
Auf die Software werde ich später noch eingehen und es wird dazu die Tage noch ein separates Video folgen, in dem ich alles genau erklären werde. Den Link zur Software ergänze ich dann im Artikel unter dem Punkt "Software".
Video zum Artikel
Das Video ist nur ergänzend. Der Artikel enthält mehr Infos und ich werde hier eventuell auch noch Dinge korrigieren. Das geht im Video nicht.
Die Materialliste und das Werkzeug
Da dieses Projekt etwas anspruchsvoller ist, werde ich zuerst auf die Materialliste und die benötigten Werkzeuge eingehen. Neben dem Slider selbst, benötigen wir folgendes Material.
Beispiele:
Schrittmotor (Quimat 17HS19-2004S1)
Zuallererst benötigen wir einen sogenannten Schrittmotor(englisch Steppermotor) NEMA 17 Bauweise. Ich habe extra ein Modell gewählt, wo die Motorhalterung und vier Schrauben inklusive waren. Außerdem war es mir wichtig, dass das Kabel lang genug ist und an einem Ende einen Stecker hat, in den Steckbrücken passen. Das ist übrigens genau derselbe Motortyp, den wir auch bei sehr vielen 3D-Druckern finden.
Das PDF mit den technischen Details ist auf der Amazonseite in den Fragen verlinkt.
Preis ca. 15 Euro.
Stepptermotor-Treiber A4988
Wir benötigen außerdem einen Steppermotor-Treiber. Ich habe mich für den populären A4988(es handelt sich hier um einen Nachbau des Polulu A4988) entschieden, welchen es im 5er Pack für 10 Euro gibt. Es liegen hier auch Kühlrippen bei, welche wir auf den Chip kleben. Dieser wird nämlich warm.
Preis für 5 Stück 10 Euro.
100 µF Kondensator
Dann habe ich mir noch einen 100 µF Kondensator besorgt, welchen wir später zwischen die Stromkabel für den Motor löten um diesen vor Spannungsspitzen zu schützen. Die kann man auf Amazon oder Ebay kaufen, allerdings nur in Paketen.
Preis ca. 2 Euro für 10 Stück.
Steckbrücken
Um alles zu verkabeln habe ich mir sogenannte Steckbrücken gekauft. Diese sind praktisch, weil wir sie einfach auf Pins schieben und bei Bedarf aber auch wieder entfernen können. Im Laufe meiner Entwicklung habe ich das sehr oft gemacht. Ich habe mir hier ein Paket gekauft in dem 40 Male-Male, Female-Female und Male-Female Stecker enthalten sind. Das sind alle Steckerkombinationen die es gibt.
Preis ca. 7 Euro.
Steckverbinder
Die Steckverbinder benötigen wir um das Shield zu erweitern bzw. um die Pins vom Arduino nach oben zu verlegen. Dazu später mehr. Außerdem habe ich einzelne Pins noch angelötet um dort dann die Steckverbinder anstecken zu können. Das ist praktischer als die Kabel fest zu verlöten (zumindest in der Entwicklung).
Preis ca. 7 Euro.
Arduino MEGA + Shield + Touch LCD (Sainsmart)
Für die Steuerung habe ich mir ein Arduino Mega gekauft bzw. ein Set von Sainsmart in dem auch noch ein TouchScreen und ein Shield enthalten sind. Das Shield wird auf den Arduino gesteckt und auf das Shield wird dann das Display gesteckt. Ein recht einfaches Konzept. Dieses Bauteil ist das teuerste, allerdings haben wir einen Touchscreen und können hier später Parameter per Touch verändern! Das ist schon eine feine Sache :)
Sainsmart Dokumentation: http://wiki.sainsmart.com/index.php/3.2"_TFT_Touch_LCD
Hier finden sich auch wichtige Details und Pinbelegungen. Außerdem wird der Kalibrierungsprozess des LCD etc. beschrieben, was wir später bei der Programmierung benötigen.
Preis 40 Euro
Stromquellen
Wir benötigen insgesamt zwei Stromquellen. Einmal eine Stromquelle für den Arduino und eine für den Motor. Für den Arduino reicht eine simple Powerbank mit 5V oder ein Batteriepack/Batteriehalter mit 6 AA Akkus. Ich habe beides probiert und mich letztendlich für die Powerbank entschieden.
A.) Powerbank (10.000 mAh 5V) ca. 25 Euro
B.) Akkupack mit Akkus ca. 25 Euro
Für den Motor benötigen wir eine stärkere Stromquelle. Ich habe es zu Anfang mit 8x AA Akkus probiert. Das lief jedoch nicht sehr stabil bzw. war relativ schnell leer, da die Voltzahl eines Akkus schnell unter 1,2V fiel. Also habe ich mir ein 12V 5A Netzteil mit einem DC-Adapter besorgt, welches ich dann letztendlich als Stromquelle für den Motor verwendet habe.
Bei diesem Netzteil war der Adapter inklusive. Diese Adapter kann man aber auch separat kaufen. Dann aber meist nur in Paketen von ca. 10 Stück.
Preis 12 Euro.
Zahnriemen und Führungsräder
Für die Führung des Sliders benötigen wir außerdem noch einen Zahnriemen und zwei passenden Zahnriemenführungsräder. Das eine Rad kommt ans eine Ende des Sliders auf den Motor und das andere Rad an andere Ende. Über diese beiden Räder verläuft dann der Zahnriemen. Der Zahnriemen wird später noch mit einer Klemme am Slider befestigt. Diese Klemme habe ich von Thingiverse geladen, dann in Blender massiv modifiziert und ausgedruckt. Aber auch hier ist ein 3D-Drucker nicht zwingend erforderlich. Meine erste Version dieser Klemme bestand aus zwei Aluwinkeln zwischen welche der Zahnriemen geklemmt wurde. Der Zahnriemen ist bei mir ca. 190 cm lang. Zwei Meter reichen.
Zahnriemen und Führungsräder anzeigen
Preis 8 Euro
Wir benötigen außerdem noch ein paar Schrauben für die Befestigung am Slider und für das Gehäuse selbst.
- Vier Schrauben für das Gehäuse.
- Schraube als Führung für das Zahnriemenrad. Befestigungsschraube für den Aluwinkel.
- Drei Schrauben für die Befestigung der Motorhalterung.
- Sechs Schrauben für das Arduino-Board bzw. der Montage im Gehäuse.
Den Motor habe ich mit drei Gewindeschrauben befestigt. Welche Dicke diese haben hängt davon ab, wie groß die Befestigungslöcher sind die ihr bohrt. Ich habe 2,5mm dicke und 3,5 cm lange Schrauben genutzt. Passende Muttern benötigen wir natürlich auch noch. Das ist jedoch vom verwendeten Slider und den Gummischeiben abhängig! Für das Gehäuse habe ich vier, 4,2 cm lange und 4 mm dicke Schrauben, samt Muttern, verwendet. Die gab es so nicht direkt zu kaufen und ich habe sie abgesägt.
Für das zweite Zahnriemenführungsrad habe ich in einen bereits vorhandene Aluwinkel ein Loch gebohrt und das Rad dann mit einer Schraube und Muttern befestigt. Da hatte ich den 3D-Drucker noch nicht, sonst hätte ich dieses Teil wohl eher ausgedruckt. Die Schraube für die Befestigung passte bei mir in das bereits vorhandene Loch im Slider, ein standard 3/8 Zoll Stativgewinde. Wenn das alles befestigt ist kann der Schlitten mit der Hand verschoben werden.
Am Motor selbst habt ihr noch zwei Dämpfer gesehen, welche ich gebastelt habe um Vibrationen zu minimieren. Diese waren Anfangs mehr als übel, was aber vorallem daran lag, dass ich den Motor im Fullstepmodus betrieben habe. Mit Microstepping, 1/16 waren die Vibrationen dann weg. Das wusste ich Anfangs aber nicht und dazu werde ich euch im Video zum Code(Programm) mehr erzählen.
Diese Dämpfer müssen also nicht unbedingt sein, außer ihr habt Probleme mit Vibrationen. Den viereckigen Dämpfer habe ich aus Moosgummi und Kork gebaut. Der Motordämpfer ist ein Modell von Thingiverse und dazwischen habe ich einen Gummiring gelegt. Solche Dämpfer kann man aber auch kaufen, ein 3D-Drucker ist also nicht zwingend erforderlich.
Mein 3D-Gehäuse bei Thingiverse: https://www.thingiverse.com/thing:3344179
Motordämpfer: https://www.thingiverse.com/thing:1826103
Die Klemme für den Zahnriemen müsst ihr eventuell selber bauen, da es davon abhängt wie euer Slider gebaut ist und wie ihr Löcher bohrt. Ich habe meine Klemme so designt, dass diese auf die zwei bereits vorhandenen Löcher,auf der Unterseite des Schlittens, passt.
Mein Remix der Belt-Clamp auf Thingiverse: https://www.thingiverse.com/thing:3346755
Werkzeuge habe ich folgende verwendet:
- Schraubenzieher
- Metallsäge
- Bohrer
- Akkuschrauber
- Standbohrmaschine
- Metallfeilen
- Lötkolben (grob)
- 3D-Drucker (für Gehäuse, Zahnriemen-Klemme und Dämpfer)
- Multimeter
Finale Kalkulation
Preise zum Zeitpunkt 10.01.2018
Preis | Link | |
---|---|---|
Slider | 60 € | |
Stepper-Motor | 15 € | |
A4988 Treiber | 10 € | |
Steckpins | 7 € | |
Kondensatoren | 2 € | |
Steckbrücken | 7 € | |
Arduino+LCD+Shield | 40 € | |
Powerbank | 25 € | |
12 V 5A Netzteil | 12 € | |
Zahnriemen und Führungsräder | 8 € | |
Summe | 186 € |
Bedenkt aber, dass wir noch einige Teile über haben. Pins, Steckbrücken und Steppertreiber!
Der Schaltplan und Verkabelung
Jetzt wo wir alle Teile beisammen haben werde ich euch den Aufbauplan zeigen. Jetzt kommen wir erstmal zur Theorie bzw. zur Verkabelung.
Zuerst verbinden wir den A4988 mit dem Arduino.
- Wir verbinden "Direction" mit Pin 8 des Boards und STEP mit Pin 10.
- SLEEP und RESET überbrücken wir mit einem Kabel.
- MS3, MS2 und MS1 sind drei Pins, welche später für die Steuerung des Microsteppings benötigen und wir verbinden diese hier mit A0, A1 und A2.
Als nächstes müssen wir die Kabel für die Logikspannung verbinden.
- Der GND Pin des A4988 wird mit dem GND Pin des Arduino verbunden und der VDD PIN mit dem 5V Pin am Arduino.
Als nächstes haben wir vier Pins für den Motor. B1, A1 und 2A und 2B. Hier ist es wichtig, dass die Kabel vom Motor korrekt verbunden werden und welche Farben zu welcher Spule führen finden wir im Datenblatt. Ihr seht hier das Datenblatt und hier ist gekennzeichnet das black und green zu einer Spule gehören und red und blue zur anderen.
- Wir verbinden jetzt also schwarz(black) mit 1B und grün(green) mit 1A, sowie rot(red) mit 2A und blau(blue) mit 2B.
Wenn ihr diese Motor-Kabel falsch anschließt, dann zuckt der Motor später nur und dreht sich nicht richtig!
Der Motor selbst benötigt allerdings auch noch eine eigene Stromquelle.
- Diese wird mit GND und VMOT verbunden.
Diese Kabel Führen zum Netzteil. Zwischen beide Phasen habe ich dann noch einen 100 µF Kondensator gelötet um den Motor vor Spannungsspitzen zu schützen. Zu guter Letzt benötigt der Arduino selbst noch Strom. Es gibt dabei einen USB und einen DC-Anschluss. Ich habe meine 5V 10.000 mAh Powerbank an den USB-Anschluss angeschlossen.
Die Pinbelegungen(Logikpins) der Kabel sollten wir uns notieren, denn diese benötigen wir nachher im Programm. Je nachdem wie ihr alles verkabelt müsst ihr diese Werte nämlich im Programm anpassen!
Löten
Das Shield und der Touchscreen sind schnell aufgesteckt und im ersten Moment ist das sehr praktisch. Wie man jetzt aber sehen kann, sind die ganzen Pins bzw. Anschlüsse durch die Platine blockiert. Aus diesem Grund habe ich mir auch diese Pinleisten besorgt. Das Shield hat nämlich freie löcher in die wir die Pinleisten einlöten können um dann von oben die Anschlüsse des Arduinos erreichen zu können. Hier im Bild seht ihr eine eingelötete Pinleiste und ich habe dann seitlich auch noch Pins angelötet, damit ich die Kabel dort einstecken kann.
Ich empfehle euch allerdings die Pins nicht nach außen einzulöten, sondern nach innen. Das sieht dann so aus und das ist besser, da so später alles besser ins Gehäuse passt bzw. das Gehäuse nicht unnötig breiter gemacht werden muss.
Motor VREF einstellen
Jetzt benötigen wir ein Multimeter, da wir die Spannung (Volt) am A4988 einstellen müssen. Ausführliche Infos über den A4988 gibt es auf der Polulu Webseite. Lest euch das unbedingt durch, denn dort wird alles genau beschrieben und die Infos sind allgemein gut.
Infos bei Polulu: https://www.pololu.com/product/1182
Schließt den Motor selbst jetzt noch nicht an bzw. entfernt die Anschlusskabel wieder. Der Motor sollte erst angeschlossen werden, wenn der VREF-Wert korrekt eingestellt ist, da man sich sonst unter Umständen den Motor zerschießt.
Der VREF, welchen wir nun am A4988 einstellen müssen, wird mit folgender Formel berechnet:
VREF=8*IMAX*RCS
Mein Motor hat
- Modell: 17HS19-2004S1
- Ohms: 1,65
- V : 2,8
- Amps DC: 2A
Der Treiber, A4988 hat meist:
- 0.05 Ohm
- 0.1 Ohm
- 0.2 Ohm
Siehe auch: https://reprap.org/wiki/A4988
RCS ist hier der Widerstand und mein A4988 hat einen R100 SMD-Widerstand, was 100 milli Ohm, also 0,1 Ohm entspricht. Ich habe dazu einfach die Platine mit einer Lupe begutachtet. Daraus ergibt sich also:
VREF=8 * 2Ampere * 0,1 Ohm
VREF=1,6 Volt
Der maximale, mit dem Netzteil gemessene VREF-Wert, meines A4988 ist allerdings 1,168V. Das habe ich gemessen als ich den Regler auf Maximum gedreht habe. Das ergibt dann:
VREF=8*IMAX*RCS
IMAX = VREF/8*RCS
IMAX = 1,168V/(8*0,1) = 1,46A
Der Motor selbst verkraftet laut Spezifikation bis zu 2 Ampere.
Um den VREF-Wert einzustellen benötigen wir den Multimeter und da habe ich zusätzlich Klemmen genutzt, weil das Handling so leichter ist. Wie ihr seht, kommt eine Klemme an den GND Pin des A4988 und die andere Klemme an den Schraubenzieher. Mit dem Schraubenzieher drehe ich nun den Regler.
Auf dem Multimeter sehen wir jetzt den aktuellen Volt-Wert und den setze ich hier etwa auf 0.8 V. Da ich nicht soviel Kraft vom Motor brauche habe ich die Spannung nach einigen Tests auf 0,8 Volt eingestellt. So gibt es weniger Wärmeentwicklung. Mit dieser Spannung läuft der Motor gut und es gab bisher keine Probleme. Ich habe während dieses Projekts sehr viel gelesen und werde noch einige Links ans Ende des Artikels packen.
Top Video von Polulu zum Thema VREF: https://www.youtube.com/watch?v=89BHS9hfSUk
Gehäuse
Nachdem ich alles erfolgreich getestet habe, wurde es Zeit alles in das Gehäuse einzubauen. Das Gehäuse habe ich samt Blender-Datei auf Thingiverse hochgeladen und im Artikel verlinkt.
Mein 3D-Gehäuse bei Thingiverse: https://www.thingiverse.com/thing:3344179
Ich habe jetzt also zuerst den Arduino im Gehäuse mit sechs Schrauben verschraubt, welche ich jedoch noch um 1mm verkürzen musste. Dann habe ich alle Kabel verlegt und den DC-Adapter des Netzteils in die Halterung gepackt. Dann muss noch der A4988 verstaut werden.
Zu guter Letzt habe ich dann das Shield und das Display aufgsteckt. Das Display bewegt sich allerdings nach unten, wenn wir darauf drücken. Ich habe deshalb ein Stück Schaumstoff zwischen die Platinen geschoben, so dass das Display nicht nach unten abknickt. Jetzt ist alles im Gehäuse verstaut und ich habe das Gehäuse mit den vier Schrauben und den dazugehörigen Muttern zugeschraubt. Fertig und jetzt kommen wir zu einer kurzen Demonstration.
Demonstration
Einen Demonstrationsslide gibt es im Video oben, Teil 1.
Die Software
Ich nutze die Accelstepper Library im Programm: https://www.airspayce.com/mikem/arduino/AccelStepper/
Code auf Github: https://github.com/mega-testberichte/mega_slider
Info
Momentan schalte ich im Code den Strom des Motors ab, wenn er sich nicht bewegt. Bei der vertikalen Ausrichtung des Sliders könnte das Probleme geben, da der Motor ohne Strom keine Kraft hat. D.h. er hält den Schlitten nicht an Ort und Stelle und die Gravitation geht ihren lauf.
Microstepping
Microstepping wird über die Pins MS1, MS2 und MS3 gesteuert. Dies werden dabei LOW/HIGH gesetzt. Folgende Kombinationen ergeben die Steps.
MS1 | MS2 | MS3 | Microsteps |
LOW | LOW | LOW | Full steps |
HIGH | LOW | LOW | 1/2 steps |
LOW | HIGH | LOW | 1/4 steps |
HIGH | HIGH | LOW | 1/8 steps |
HIGH | HIGH | HIGH | 1/16 steps |
In der V1.0 kann die Software folgendes
- NORMAL: Automatische "Normale" Bewegung komplett von rechts nach links und zurück.
- ACCELERATED: Beschleunigte Bewegung komplett von rechts nach links und zurück.
- START/BACKW/HOME: Manuelle Steuerung. Drücken und halten wir START dann läuft der Slider normal. Drücken und halten wir BACKW, dann läuft der Slider rückwärts.
- Timelapse/Zeitraffer: Hier kann eine Zeit und eine Strecke gewählt werden. Der Slider fährt dann beispielsweise alle 60 Sekunden 200 Einheiten weit.
- Geschwindigkeit: Die Geschwindigkeit kann in Schritten reguliert werden. Dementsprechend schnell oder langsam läuft der Slider dann.
Fazit
Diesen Slider habe ich mir gebaut um damit zukünftige Kamerafahrten zu realisieren. Das bedeutet, dass ich ihn in Zukunft aktiv nutzen werde. Es steckt einiges an Arbeit in diesem Projekt aber ich habe enorm viel gelernt und habe nun einen sehr flexiblen Slider. Ich kann nämlich jederzeit andere Software schreiben bzw. aufspielen und der Slider hat mich, samt Material auch nur etwa 130€ gekostet. Korrektur: Gesamt 186 Euro (Slider inklusive).
Wenn ihr einen motorisierten Slider kaufen möchtet, dann müsst ihr mit mindestens 300€ rechnen und könnt dort aber die Software nicht verändern und habt dann wahrscheinlich auch nicht so viele verschiedene Modi wie meine DIY-Version. Für mich hat sich das auf jeden Fall gelohnt und ich kann nun alles so programmieren wie ich es möchte.
Falls sich irgendwelche Probleme ergeben sollten werde ich diese im Artikel nachtragen und lösen. Das war ein weiteres Do-it-Yourself Projekt von mir und ich hoffe es hilft dir weiter.
Sonstiges, Gedanken, Zukinftsideen
Info, wenn wir andere Slider nehmen. Am praktischsten sind Slider mit Röhren, weil wir dann nach unten freien Platz haben. Bei Slidern auf Schienen müssen wir in die Schiene Löcher bohren. Aufwendiger.
Gehäuser Verbesserungen
Gehäuse ist in Ordnung für die erste Version. Die Schraublöcher für den Arduino hätten 1-2mm höher sein sollen. Ich habe die Schrauben kurz abgeschliffen um 2 mm. Halterung für den DC-Stecker verbessern. Beim Herausziehen kommt der leicht heraus.
Weitere Ideen
Touchscreen benötigt mehr Strom als ohne. Ich weis nicht wie man den Touchscreen ausschalten könnte. Für den mobilen Einsatz bräuchten wir hier richtig starke Akkus.
Kann man den Timelapse/Zeitraffer mit einem Akku stundenlang laufen lassen? Problem der LCD ist dauerhaft an?
Man könnte ein Bluetooth-Modul nutzen und den ganzen Slider per Smartphone-App steuern.
Welches Arduino?
Der Mega hat mehr Anschlüsse bzw. Pins. Das Touchdisplay braucht viele Pins. Ihr könnt das alles aber auch mit kleineren Arduinos (Uno oder ähnliche) machen und dann eben Schalter nutzen.
Microstepping
- https://forum.arduino.cc/t/update-current-adjustment-for-motor-drivers-drv8825-a4988/400151
- https://electronics.stackexchange.com/questions/284448/how-to-use-a4988-microstepping
Research und Links
https://github.com/synthetos/TinyG/wiki/Stepper-Motors-and-Power-Suppli…
Motor Strom:
- https://reprap.org/wiki/Pololu_stepper_driver_board
- Microstep infos: https://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-…
Artikel
- Mit driver Messung: https://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-…
- https://arduino-projekte.info/schrittmotor-ansteuern-mit-arduino-a4988/
- Gutes video A4988 https://www.youtube.com/watch?v=-q9tl-hhHgY
- Schaltplan: https://www.pololu.com/product/1182/pictures
- Accelstepper library: https://www.arduino.cc/en/Tutorial/StepperSpeedControl
- https://scientistnobee.wordpress.com/2015/03/12/my-experiments-with-ste…
- Motor Tutorial: https://www.arduino-tutorial.de/arduino-a4988-nema17/
- Polulu specs: https://www.pololu.com/product/1182
- https://www.instructables.com/id/Drive-a-Stepper-Motor-with-an-Arduino-… SEHR GUT
- Super Vergleich zwischen A4988 und TB6600/DM420A : https://www.youtube.com/watch?v=oI2DACP_U58
- Richtiges Top Video zu Stepper-Motoren: https://www.youtube.com/watch?v=MOHYFSOp9Kc
Accelstepper code
- https://www.pjrc.com/teensy/td_libs_AccelStepper.html
- http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
Weitere Ideen/TODO
Notizen für mich selbst. Verbesserungen.
Die Basis des Kopfs auch per Motor ansteuern bzw. drehen. So könnte ich den Kopf während der Fahrt drehen und einen Fokuspunkt beibehalten.
So wie das hier: https://amzn.to/2P0ygug
Fehlerquellen
Der Artikel wurde verschoben, dabei sind die Kommentare verloren gegangen. Ich habe aber die Fragen und Lösungen festgehalten.
Wenn Fehler angezeigt werden wie:
- "undefined reference to `Sinclair_M'
- undefined reference to `Various_Symbols_16x32_v2'
Dann fehlen die Schriftarten! Hier laden und ins korrekte Verzeichnis kopieren: http://www.rinkydinkelectronics.com/r_fonts.php