Help needed for my ...
 
Notifications
Clear all

Help needed for my stepper-ballscrew project

132 Posts
9 Users
17 Likes
4,676 Views
Bradscopegems
(@bradscopegems)
Member
Joined: 11 months ago
Posts: 25
Topic starter  

I have built a laser-scanning microscope deliberately designed with no eyepieces. I now wish to use an Arduino plus one stepping motor to transport a mirror in and out : in the 'in' position it reflects an image to a camera. It is my first Arduino project. Bill's marvellously clear tutorials encouraged me to go beyond the Blink barrier into the unknown. I bought a beautiful ballscrew-coupled stepper  on eBay for the remarkably low price of US$61  (£50 sterling) and am driving it using Bill's sketch for a bipolar motor with driver type A4988. There is no specsheet available for the motor (labelled 42BYGH48) and the only parameters written on the label are 1.8 degree step, 0.4 N/m torque and 1.2 A current. I measured the coil resistance as 3.5 ohms per coil and (by Ohm's law) calculate the voltage to be 4V per coil. Is this a valid calculation? By trial and error I found the lead colours to be green=2B, red=2A,yellow=1A and blue=1B, so I was able to connect and run the motor. I noticed that the A4988 definitely heated and required the heatsink and wished to check the current by Bills procedure. I was unable to find any test contact marked with a plus sign: I wondered if it was the tiny tongue of metal marked with the green arrow in my second photo?  There was no obvious test contact on a mainly-green A4988 from a different supplier either. If I can be sure that I am not running with two great a current I will proceed to add a limit switch as a 'homing' device and will be able to go forward to moving the mirror in and out.  Congratulations on the high quality of the tutorials and for the rather rare but invaluable availability of them as printable PDF files. I am too old to learn such detailed programming

chinese stepper with ballscrew

without printed instructions to refresh my memory: I have been printing screendumps of my own sketches via Photoshop, which has helped me a lot.

A4988 labelled small

 


   
Quote
Will
 Will
(@will)
Member
Joined: 3 years ago
Posts: 2533
 

@bradscopegems

You're never too old to learn to program an Arduino 🙂

The object at the green arrow is the potentiometer that's used by the A4988 to adjust the current sent to the stepper.

Here's an URL to a Datasheet for a 42BYGH48 stepper motor.

https://www.handsontec.com/dataspecs/motor_fan/42BYGH48-4170.pdf

Anything seems possible when you don't know what you're talking about.


   
ReplyQuote
Inq
 Inq
(@inq)
Member
Joined: 2 years ago
Posts: 1900
 

Posted by: @bradscopegems

I measured the coil resistance as 3.5 ohms per coil and (by Ohm's law) calculate the voltage to be 4V per coil. Is this a valid calculation?

Yes, it's a valid measurement, but it of little to no use (that I know of).  Things like inductance come into play that really, @davee is the only one that I know here that can explain how your measurement is useful or not.  I was very surprised that @will link had no mention of voltage permitted.  Most NEMA 17 in this size range must have an input voltage between 12V and 24V.  NEMA 17 have the same cross-section, but various lengths for more/less torque.  Yours look close to what I've used being:

"https://www.amazon.com/STEPPERONLINE-Stepper-Bipolar-Connector-compatible/dp/B00PNEQKC0"

I've played around with different voltages with these (with A4988) and found they are far happier, more responsive, faster, stronger, less prone to losing steps if you have a higher voltage (24V).  

Posted by: @bradscopegems

I was unable to find any test contact marked with a plus sign: I wondered if it was the tiny tongue of metal marked with the green arrow in my second photo?  There was no obvious test contact on a mainly-green A4988 from a different supplier either. If I can be sure that I am not running with two great a current

I had difficulties using Bill's technique.  It made far more sense to me than the standard way of using it, but I ended up using standard techniques.  If you need a sleeping pill, here was my forum request for help on the issue - https://forum.dronebotworkshop.com/motors/mal-justed-a4988/

I ended up using the technique specified here. - https://www.pololu.com/product/1182 .  I am not certain, but I believe Pololu was the creator of the original A4988 that everyone has cloned down to a $1 a piece.

Also of note, the A4988 supplies less current if it is controlled by a 3.3V micro (ESP8266/ESP32) versus a 5V micro (Arduino).  The best I can get is 1.3A output which worked fine with my steppers above that can handle up to 2.0 amps.

Good luck with your project.

Inq

3 lines of code = InqPortal = Complete IoT, App, Web Server w/ GUI Admin Client, WiFi Manager, Drag & Drop File Manager, OTA, Performance Metrics, Web Socket Comms, Easy App API, All running on ESP8266...
Even usable on ESP-01S - Quickest Start Guide


   
ReplyQuote
Will
 Will
(@will)
Member
Joined: 3 years ago
Posts: 2533
 

@inq @bradscopegems

Posted by: @inq

I was very surprised that @will link had no mention of voltage permitted.

That's because the voltage is usually limited by the driver. In this case, an A4988. I believe the max voltage for the -23 is about 48 Volts (continuous).

 

Oops, forgot to mention that the A49888 will only handle 32-35 Volts max.

 

Anything seems possible when you don't know what you're talking about.


   
ReplyQuote
Inq
 Inq
(@inq)
Member
Joined: 2 years ago
Posts: 1900
 

Posted by: @will

@inq @bradscopegems

Posted by: @inq

I was very surprised that @will link had no mention of voltage permitted.

That's because the voltage is usually limited by the driver. In this case, an A4988. I believe the max voltage for the -23 is about 48 Volts (continuous).

 

Oops, forgot to mention that the A49888 will only handle 32-35 Volts max.

 

Yes, I understand that the driver controls the voltage to regulate so it doesn't  over current the motor, but all the stepper motors I've used do specify a min and max voltage.  My only real point is the 4V number he calculated is far less than will be required to reliably drive it... IF it is the typical Nema 17 12V to 48V capability motor.  

I found one forum post saying they drive this 42BYGH48 stepper with 42V and I found one advertisement for it saying it was a 12V nominal motor.  As you pointed out - if the A4988 is calibrated properly to limit to the 1.5 amps, it really doesn't matter what the supply voltage is (within reason).

VBR,

Inq

 

3 lines of code = InqPortal = Complete IoT, App, Web Server w/ GUI Admin Client, WiFi Manager, Drag & Drop File Manager, OTA, Performance Metrics, Web Socket Comms, Easy App API, All running on ESP8266...
Even usable on ESP-01S - Quickest Start Guide


   
ReplyQuote
(@davee)
Member
Joined: 3 years ago
Posts: 1691
 

Hi @bradscopegems,

PS: As usual, in the time it takes me to write a 'sermon', there are half a dozen other comments in the list ... I leave the following text unchanged, because I don't think there are any technical contradictions. Apologies to all if I overlap, etc. in the overall discussion flow. Dave

  Nice project! @will has already given you some good advice, including not being too old to learn something!

It is always difficult to visualise how much other people on the forum already know, so apologies if this discussion  is 'old hat' to you ... I hope it will help to answer a few queries you might have, but not yet found an answer to. Please comment if you found it useful or otherwise.

--------

  Obviously Ohm's law is universal, but stepper motors and controllers often appear to 'bend it'.

  Each motor winding is essentially an inductor (as well as the source of a dynamic magnet field), so the following discussion attempts to describe how Ohm's law can appear to be 'bent' .

  When a voltage is first applied to an inductor (e.g. a coil of wire), the current immediately the voltage is applied, will be much less than you might expect from a simple Ohm's law calculation based on resistance of the wire and the voltage. This is because the change of current will induce an opposing voltage within the coil.

There are lots of descriptions of the physics involved .. e.g. https://www.electronics-tutorials.ws/inductor/lr-circuits.html

from which you can find :

image

However, this full picture is far more complicated than you need to understand for your project, so lets keep it simple .

Note in graph, the current blue curve) at time zero, is also zero, and that the current gradually increases until it reaches a steady value on the right hand side of the graph at a 'long' time.

The exact shape of the curve and how much is 'long' time depend upon the circuit details, but the general story is always the same.

At a 'long' time, if the applied voltage is constant 'V' volts, then the current will be equal to the value Ohm's law predicted by I = V/R, where R is the resistance of the coil.

------

Now the force the (ideal, no frictional loss) motor exerts on the load will be proportional to current, so whilst the current is building up to a maximum, the force will be doing likewise, which will limit how quickly the rotor will move.

To offset this effect, it is common to apply a much higher voltage to a stepper motor when it is being commanded to move to the next 'step' position, so that the current build up is made more rapid.

However, if that 'high' voltage was continually supplied to the motor, the current would increase far beyond the maximum current rating for the motor, and magic smoke would soon begin to emerge from the motor!

Hence the controller includes a current sensor, which effectively reduces the voltage when the current reaches a preset current level, so that the maximum current rating of the motor is not exceeded.

For the common small controllers, like the one in your photo, this current level is preset by adjusting the small pot the arrow is pointing to.

----

Further confusions involved with this subject include:

  • the controller reduces the effective voltage by a trick called PWM ... pulse width modulation ... so that instead of outputting a constant DC voltage, it goes into a mode which continually switches between the higher voltage applied initially and zero, so that the average voltage is less than the maximum
  •  
  • Stepper motors tend to 'cog' on each new step ... controllers now commonly 'microstep' so that the current changes are much smoother. I would expect you to want to make use of this for your application. This also involves PWM.
  •  
  • For applications that involve stepping at higher rates (e.g. 3D printers), the stepper motor controller, or the processor (Arduino say?) may dynamically change their stepping rates to accelerate and decelerate to allow for the effects of mechanical inertia of the whole system. This may also be useful in your application.

I mention these last three points as minimal introductions, in case you were not aware of them, as you might find them useful pointers to research further as your project proceeds.

------

Bill's @dronebot-workshop) excellent tutorial

https://dronebotworkshop.com/big-stepper-motors/

  may initially appear to be beyond the scope of your project, but in reality usefully further discusses some of these points.

I assume you have already seen:

https://dronebotworkshop.com/stepper-motors-with-arduino/

And maybe even glanced at this one, although it may not be as relevant:

https://dronebotworkshop.com/wifi-stepper-motor-controller/

-----------------

Good luck with your project ... I hope you will be able to post a few interesting microscope pictures, as well as further questions or discussions on the technical side.

Best wishes, Dave


   
ReplyQuote
Bradscopegems
(@bradscopegems)
Member
Joined: 11 months ago
Posts: 25
Topic starter  

Thank you both for your advice. I am still confused, but at a deeper level. I do not understand how to do the current measurement by the Pololu method, since the image of the Pololu driver does not correspond to my A4988.. or am I missing something? I also see from Will's message that a bipolar stepper motor can have the same model number marked on it as mine but have a different appearance, with a row of six pins in a plastic connector on the motor instead of leads just emerging from a grommet in the body like mine, and a different set of colours from mine, including a black lead I do not have and lacking a yellow lead, which I have. Also the specsheet gives 1.7 A per phase whereas my motor is marked 1.2 A....

I will check carefully to see if my motor is losing steps. Because I calculated 4V I have been powering it with a 5V PSU with 2.1A max current and it has worked perfectly so far.

 I have read somewhere that it is bad to power up a motor while it is connected to the driver chip and Arduino. In what order should everything be powered up? When I disconnect from the computer's USB,  and run the Arduino, I put 9V into the Arduino jack socket ( I read that this higher voltage is to allow the Arduino to create its own smooth 5V digital running voltage). Should I switch on the motor power before or after doing this? This kit is meant to be used by a large number of people, so it may be difficult to make them follow the correct turn-on routine.... I may have to design a circuit to ensure that the routine is automatic.

I will report back after more tests....


   
ReplyQuote
Bradscopegems
(@bradscopegems)
Member
Joined: 11 months ago
Posts: 25
Topic starter  

Dear Dave,

                  Thank you for your lucid explanation of inductance v. resistance.

Somewhat off topic now:   I am not sure that it is appropriate for me to post images from the microscope, which I named 'Mesolens' because it is functionally intermediate between a microscope and macrophotography optics. However, since you asked and since it is not really commercialized yet, I can give a link to an academic research group using it: https://www.centreforbiophotonics.com/.   The image at the start of that website is of an intact fruit fly, in which every cell is imaged. No camera exists which can record all the information in such images, which are produced by confocal laser scanning and exist only in computer memory. The have the highest info content of any biological image so far. The Mesolens has great potential in medicine, biology, forensics and other fields, but, unfortunately, the lens system is very difficult to make and the latest version took three years to manufacture. There are only five systems, all in the UK. We need an Elon Musk to fund us!  And, no, we do not have a patent:  complex optical systems are impossible to patent. The friendliest of the big four microscope manufacturers is Nikon but a senior person in that company has told me that they are watching and if we get sales they will simply design their own version and pay no royalties to us..... The current stepper project is to update the absolute prototype, which is still intensively used in Strathclyde (Scotland) where they did not add eyepieces because of laser safety problems, which we have solved in later models.


   
ReplyQuote
robotBuilder
(@robotbuilder)
Member
Joined: 5 years ago
Posts: 2043
 

@bradscopegems 

The friendliest of the big four microscope manufacturers is Nikon but a senior person in that company has told me that they are watching and if we get sales they will simply design their own version and pay no royalties to us.....

So why are you doing it?  Are you simply trying to design a better version of an optical imaging method that already exists?


   
ReplyQuote
(@davee)
Member
Joined: 3 years ago
Posts: 1691
 

Hi @bradscopegems,

  @Inq has more experience in the practicalities of stepper motors than I can imagine, but my impression is both the driver boards and the motors themselves have been cloned, copied, etc. many, many times, so that variations of wire colours, plug and sockets, etc. through to fundamental things like max recommended current are far from fixed values. Much of the 'game' is to look for the 'nearest' and 'closest' information sources, but be ready to adjust and allow for the differences.

The small driver board in your photo is a classic case ... there are endless numbers of variations of it around, using different chips, etc. I have the impression Pololu may have designed the 'original', but the clones tend to behave the same way, although there will be differences in maximum currents and voltages, etc. that they can handle, although these may not affect you if you are keeping the voltage and current levels to modest values.

In terms of setting up the current level, accepting the Pololu board is superficially different in appearance, what part of their video on how to set the current does not appear to match what you could do with your board?

As I have mentioned, details like wire colours for motors can differ. Personally, I would start by using an Ohmmeter to identify the connections to each winding ... hopefully you will just have two wires/pins for each of the two windings, and no connection between the two windings or any other pin/wire. At this point you should be able to match up to any circuit description. You may have the windings reversed, but I think it should work, though maybe go backwards, which has an obvious fix. Perhaps @Inq can point to any other problems.

Note that the Pololu reference includes some information on different types of motors and their connections, that may be informative.

I have read some motors have 6 pin connectors, but only 4 of the pins are connected ...

If you are only stepping slowly, it is feasible to use a low voltage for the reasons I tried to explain above. Some applications naturally try to achieve the highest possible stepping rates, and hence the common reason for increasing the available voltage.

Note that the actual motor current with driver chips like the A4988 may be quite different from the current measured flowing from the power supply ... I think there is a video discussing this on the Pololu website.

--------

I don't have enough experience to mention every combination of events that may cause a failure, but the 'obvious' bad one is connecting/disconnecting a motor wire whilst the driver chip is powered.

As I explained before, when the voltage is first applied to a coil, the inductance will try to reduce the current flow by producing an opposing voltage .. that is the inductor is trying to oppose the current level increasing. The inverse occurs when the external circuit tries to reduce the current flowing through the coil ... the inductance will try to keep the same level of current flow ... and will produce a voltage to attempt to achieve it.

When a coil with a current passing through it is disconnected it can produce a very high voltage spike ... and that voltage can result in destruction of the driver chip. Note, this means you should be careful to avoid insecure connections between the driver chip and motor at all times the power is on, since a momentary poor connection due to vibration etc. could be enough to kill the driver chip.

In any system where one chip connects another chip, typically via data lines, and each chip has a separate power source, opportunities for problems are usually close by and often difficult to predict.

Looking at the circuit Bill shows as an example in https://dronebotworkshop.com/stepper-motor-hall-effect/ :

image

The A4988 board has two power inputs. 5V (& 5V ground) and +12V (& 12V ground).

The 5V supplies the part of the A4988 which connects to the Arduino data lines, whilst the 12V supplies the part of the A4988 which drives the motor windings.

Because the +5V is taken from the Arduino board, it follows that the Arduino processor and the data interface parts of the A4988 will power up at the same time ... so no conflict there.

I would hope that A4988 has been designed so that the 12V supply could be applied or removed,  either or before the Arduinio power was applied or removed. I didn't spot any warnings during a quick glance at the A4988 data sheet about order of applying power, and I noticed that if the data interface power voltage was less than about 2.8V, then it should go into a 'safe' power down mode.

Notes and recommendations from above discussion:

  1/ Use the same power supply for both the Arduino and the A4988 for the 'Vdd' power. If you are applying 9V (say) to the Arduino board, then the 5V regulator on the Arduino board should also be able to supply the small current neded by the A4988 Vdd supply ... so follow Bill's example shown in the diagram above.

  Then you should be able to safely power on and off the '12V supply' for the motor at any time. Of course, your supply might not actually be 12V .. as you describe yours is a separate 5.1V 2A supply.

 2/ Looking at the A4988 datasheet, https://www.digikey.co.uk/en/htmldatasheets/production/693406/0/0/1/a4988

I note it specifies a motor power supply voltage range of 8V to 35V.

Obviously, the minimum of 8V is higher than the 5.1V power you describe. I don't know how this will affect its operation, but if you get problems, this issue may need to be addressed.

  3/ Probably not relevant at the moment, but should you replace your Arduino with a different processor which uses 3.3V (e.g. some alternate Arduinos, or ESP32), then the Vdd power to the A4988 board should also be reduced to 3.3V.

4/> https://www.pololu.com/product/1182

--------

Best wishes, Dave

 


   
ReplyQuote
Inq
 Inq
(@inq)
Member
Joined: 2 years ago
Posts: 1900
 

Posted by: @bradscopegems

I was unable to find any test contact marked with a plus sign: I wondered if it was the tiny tongue of metal marked with the green arrow in my second photo?

When using the Pololu (typical) method, you adjust the potentiometer circled in green until you get the voltage value (you need to calculate).  Typically you connect the positive lead of your voltmeter to your metal screwdriver that you in-turn use to turn this potentiometer.  IOW... the pot is the + lead you use to measure.

image

If you search for "A4988 Calibration" on YouTube, you'll get thousands of videos.  Then it is simply a matter of watching one that is easiest to understand (because of accents 😆).  A4988 are the bread and butter of 3D Printers and so they have to be universal.  Yours may look a little different, but it has to be interchangeable.

Posted by: @bradscopegems

Because I calculated 4V I have been powering it with a 5V PSU with 2.1A max current and it has worked perfectly so far.

At what stage of testing?  I can imagine 5V can turn the motor using Bill's sketch with just a piece of tape stuck to the shaft.  But as you try to run it at faster speeds and/or under load, you'd find it starting to stutter (skipping steps). 

If you are at this slow/tape test stage, see if you can stop it with your fingers.  With voltages closer to 24V and with current calibrated to the 1.2 Amps, you won't be able to stop it with your fingers.  At 5V, I'd bet you could.

As @will said, the voltage of the PSU is not that important (as long as it is enough voltage and current).  It is the job of the A4988 to protect the motor (and itself).  It will not transmit more voltage to the stepper motor than it can take.

Also note - Some of these tiny potentiometers have a stop.   Some have a detent and some can just turn all 360 degrees indefinitely.  Either way, the region that gives your desired voltage will be a very small window.  For instance... it might indicate 0.03 for 355 degrees and then suddenly shoot up to the 1.0+ and then fall back down to 0.03 volts. 

Hope this helps.

3 lines of code = InqPortal = Complete IoT, App, Web Server w/ GUI Admin Client, WiFi Manager, Drag & Drop File Manager, OTA, Performance Metrics, Web Socket Comms, Easy App API, All running on ESP8266...
Even usable on ESP-01S - Quickest Start Guide


   
ReplyQuote
Bradscopegems
(@bradscopegems)
Member
Joined: 11 months ago
Posts: 25
Topic starter  

Dear Robot builder,

                             You ask 'why did we do it?'.

                             My main claim to fame was to be part of a team that developed the first really practical laser scanning confocal microscope in the 1980s. This was a roaring success commercially and scientifically and it took more than two years for the big microscope companies to catch up.  But the ability of confocal microscopes that caused their use from that time to spread throughout the world was that they could produce 'optical sectioning': i.e. the user could look at a whole cell or even a lump of tissue and see only the structure in one thin layer. Optical sectioning was obtained only with objectives of high magnification ( a high numerical aperture is essential to good confocal function) so users complained that they wanted an objective of low magnification that would work in a confocal microscope, so they could examine large objects such as a whole mouse embryo and see individual cells. However, it was necessary to start from scratch with the design, because such an objective produces too much detail to be seen in the human eye, so the microscope manufacturers have never attempted it. We put years of work into the design and the alignment of the lenses had to be done with unprecedented accuracy. The lenses had to be larger than those of any normal microscope, e.g. 65 mm in diameter but they had to be centered to an accuracy of better than 3 microns.  I had been told that imaging mouse embryos would be a major application, because human genes that cause serious defects in the heart and major vessels of newborn babies could be identified by placing copies of the genes in transgenic mice. We succeeded, and produced images of mouse embryos that could  be optically sectioned through: just like an MRI image. However, scientists soon lost interest when they found that this type of microscope is so expensive and takes so long to make that it does not fit into the normal 2-3 year research grant cycle. I have great experience of patenting and patent disputes, so I know that we could easily get a patent, but the expensive lawyers of the big four companies would argue that since the need was widely appreciated and we used standard (Zemax) design software, there was no inventive step. If that failed, they would simply alter a small feature of our design and proceed to infringe our patent, claiming that their feature made theirs novel, and they could run down the clock in a legal dispute that I ( or even a UK research council) could not win. Our demo lab in Strathclyde was in a rather obscure part of a minor country going crazy with a madness called Brexit and came on stream just as COVID appeared: two reasons why researchers did not want to visit and try out the system.  As well as these problems, scientists have never before had the ability to collect a terabyte of data about the subcellular structure of an embryo or a plate of tissue culture and have not yet discovered how they could use such a lot of information, but this is changing: the Strathclyde lab is beginning to use it to map the spread of pathogens through various organs in tuberculosis and trypanosome diseases, seeing immune cells operating and getting good quantitation because of the large number of cells studied. Its time will come, and AI will probably provide the answer to handling the data, but it may be ten or twenty years away.


   
ReplyQuote
Bradscopegems
(@bradscopegems)
Member
Joined: 11 months ago
Posts: 25
Topic starter  

Dear inq,

                 Your message is very helpful.  If I understand you correctly, I should switch on the Arduino and this would supply the voltage to the digital side of the driver board. Then I could switch on the power to the motor and  any spikes generated by induction in the coils would not harm the board or the Arduino, presumably partly because of the 100 uF capacitor across the power leads.  This is immediately relevant: if the stepper drives the carriage to the end of its travel on the ballscrew and my 'homing' or 'STOP' signal does not work, I will want to kill the power ...

      And the point about the use of a conductive screwdriver as a voltage probe was also most helpful.


   
ReplyQuote
byron
(@byron)
No Title
Joined: 5 years ago
Posts: 1122
 

Just to add a little extra to the stepper motor info, a subject of which I'm only just getting into having watched the dronebot video's but also some others one of which came out this week, is that there are closed loop stepper motors that also have encoders to check the required steps were actually achieved.   I understand that these are often used in CNC machines so that the motors can be stopped rather then continue with a misstepped condition.  I don't suppose its if much relevance to this project, but you never know. 👍 

@bradscopegems - interesting read on your project, and wish you all success with your microscope.


   
ReplyQuote
(@davee)
Member
Joined: 3 years ago
Posts: 1691
 

Hi @bradscopegems,

  Thanks for your kind and informative 'off-topic' reply. I was 'aware' of the concept of using lasers and cameras to push the magnification and depth-of-field limits of optical microscopes, particularly for biological specimens, as well as the obvious possibilities of using the laser to 'excite' the sample, looking for fluorescence, etc. to gain further insight into what was being observed, whilst being aware this generally required more resources than the 'average' retired hobbyist would have in their spare room or garage. However, just because companies like Nikon do something, that does not mean that others with much more smaller budgets can't be inventive and successful in their own right, especially if their particular field of interest is not seen as a 'commercial winner'.

So I was curious to know what could be achieved in the field ... I thought it had to be someone with a particular research background but I wasn't expecting to see some prestigious Universities to be mentioned, let alone a principal expert, all of which was a pleasant surprise. As someone who has always lived in the UK, I am always delighted to see Universities still doing research for the pursuit of knowledge, regardless of whether they have a realistic chance of getting any financial return.

I hope that you now have enough information to make some good progress and will make further contributions to the forum.

Best wishes, Dave


   
Inst-Tech reacted
ReplyQuote
Page 1 / 9