Forum: Mikrocontroller und Digitale Elektronik Kraftsensoren für den Physikunterricht mit Arduino


von Christoph E. (stoppi)



Lesenswert?

Hallo!

Als schnelles Zwischenprojekt habe ich mir zwei Kraftsensoren für den 
Physikunterricht gebastelt. Basis ist in beiden Fällen ein Arduino, 
einmal ein Nano und beim anderen ein Mega.

Beim Modell mit dem 16x2 display kommt ein 100g-Wägezelle zum Einsatz, 
bei jenem mit dem 320x480 pixel display eine 1kgWägezelle.

Damit erhalte ich eine Auflösung von 0.1 mN bzw. 10 mN.

Mit den Sensoren lassen sich dann allerhand physikalische Experimente 
quantitativ und qualitativ erfassen wie zum Beispiel die Bestimmung der 
Oberflächenspannung mit der Ringmethode oder die Bestimmung des Haft- 
und Gleitreibungskoeffizienten.

Gekostet hat mich der Spaß für beide Modelle wohl nicht einmal 30 Euro. 
Hier gibt es ja eine Menge Leute, die über Arduino gewaltig lästern. Ich 
finde ihn für meine Zwecke (in der Regel Physikexperimente bzw. 
Messgeräte für den Physikunterricht) einfach ideal. Habe bis jetzt noch 
jede meiner Ideen damit umsetzen können und zwar vom einer einfachen 
Sonographie, über Lasermikroskop bis hin zum Segway. Und das ganz ohne 
shield ;-)
1
#include <UTFT.h>
2
#include <Wire.h>
3
#include <HX711.h>                       
4
5
HX711 scale(A1, A0);  
6
7
long Rohwert;                  // vom HX711 gelieferter Rohwert
8
long offset = 5300;            // offset
9
float Scale = 50000;           // scale
10
float Kraft_alt, Kraft_neu;    // berechnete Kraft in N
11
12
13
// Declare which fonts we will be using
14
extern uint8_t SmallFont[];
15
16
UTFT myGLCD(ILI9486,38,39,40,41);
17
18
int i, j;                 // Zählvariable
19
20
const int offsetPin = 2;     // the number of the pushbutton pin
21
int offsetState = 0;         // variable for reading the pushbutton status
22
const int startPin = 3;      // the number of the switch pin
23
int startState = 0;          // variable for reading the switch status
24
25
26
27
// ====================================
28
// ===                              ===
29
// ===            SETUP             ===
30
// ===                              ===
31
// ====================================
32
33
void setup()
34
   {
35
    Serial.begin(9600);
36
   //    while(!Serial);    // time to get serial running
37
38
    pinMode(offsetPin, INPUT);
39
    pinMode(startPin, INPUT);
40
  
41
    // Setup the LCD
42
    myGLCD.InitLCD();
43
    myGLCD.setFont(SmallFont);    
44
    myGLCD.clrScr();
45
   
46
    myGLCD.setColor(255, 255, 0);
47
    myGLCD.fillRect(0, 0, 479, 13);
48
    myGLCD.setColor(0, 0, 0);
49
    myGLCD.setBackColor(255, 255, 0);
50
    myGLCD.print("Newtonmeter - stoppi", CENTER, 1); 
51
52
53
    scale.set_gain(128);   // A-Kanal: gain = 64 oder 128; B-Kanal: fix 32
54
55
    Kraft_alt = 0.0;    
56
   }
57
58
59
60
61
// ====================================
62
// ===                              ===
63
// ===        HAUPTSCHLEIFE         ===
64
// ===                              ===
65
// ====================================
66
67
void loop()
68
   {    
69
    while(startState = digitalRead(startPin))   // Warten bis start-Taster betätigt wurde
70
       {        
71
        Rohwert = scale.read();              // Einlesen eines Rohwerts
72
  
73
        Kraft_neu = (Rohwert - offset) / Scale;  // Berechnung der Kraft in Newton
74
75
        //Serial.println(Kraft_neu);
76
        
77
        myGLCD.setColor(0, 255, 0);
78
        myGLCD.setBackColor(0, 0, 0);
79
        myGLCD.print("        ", 70, 18);
80
        myGLCD.printNumF(Kraft_neu, 2, 70, 18);
81
82
        offsetState = digitalRead(offsetPin);    // button for new tara (offset)
83
    
84
        if (offsetState == LOW)
85
           {        
86
            offset = scale.read();   // Einlesen eines Rohwerts zur Ermittlung des offsets            
87
           }       
88
89
        delay(20);
90
       }
91
92
    Kraft_alt = 0.0; 
93
    
94
    myGLCD.clrScr();
95
    
96
    myGLCD.setColor(255, 255, 0);
97
    myGLCD.fillRect(0, 0, 479, 13);
98
    myGLCD.setColor(0, 0, 0);
99
    myGLCD.setBackColor(255, 255, 0);
100
    myGLCD.print("Newtonmeter - stoppi", CENTER, 1);
101
102
    // Zeichnen der beiden Achsen
103
    
104
    myGLCD.setColor(255, 255, 255);
105
    myGLCD.drawLine(50,290,430,290);
106
    myGLCD.drawLine(50,20,50,290);
107
108
    myGLCD.setColor(255, 255, 255);
109
    myGLCD.setBackColor(0, 0, 0);
110
    myGLCD.print("F[N]", 5, 18);
111
    myGLCD.setColor(255, 255, 255);
112
    myGLCD.setBackColor(0, 0, 0);
113
    myGLCD.print("t[sec]", 420, 300);
114
                
115
    myGLCD.setColor(255, 255, 255);
116
    myGLCD.drawLine(45,290,50,290);
117
    myGLCD.drawLine(45,240,50,240);
118
    myGLCD.drawLine(45,190,50,190);
119
    myGLCD.drawLine(45,140,50,140);
120
    myGLCD.drawLine(45,90,50,90);
121
    myGLCD.drawLine(45,40,50,40);
122
        
123
    myGLCD.drawLine(50,290,50,295);
124
    myGLCD.drawLine(100,290,100,295);
125
    myGLCD.drawLine(150,290,150,295);
126
    myGLCD.drawLine(200,290,200,295);
127
    myGLCD.drawLine(250,290,250,295);
128
    myGLCD.drawLine(300,290,300,295);
129
    myGLCD.drawLine(350,290,350,295);
130
    myGLCD.drawLine(400,290,400,295);
131
        
132
    myGLCD.setColor(255, 255, 255);
133
    myGLCD.setBackColor(0, 0, 0);
134
    myGLCD.printNumI(0,30,285);
135
    myGLCD.printNumI(2,30,235);
136
    myGLCD.printNumI(4,30,185);
137
    myGLCD.printNumI(6,30,135);
138
    myGLCD.printNumI(8,30,85);
139
    myGLCD.printNumI(10,25,35);
140
       
141
    myGLCD.printNumI(0,48,300);
142
    myGLCD.printNumI(4,98,300);
143
    myGLCD.printNumI(8,148,300);
144
    myGLCD.printNumI(12,194,300);
145
    myGLCD.printNumI(16,244,300);
146
    myGLCD.printNumI(20,294,300);
147
    myGLCD.printNumI(24,344,300);
148
    myGLCD.printNumI(28,394,300);
149
        
150
151
    // graues Gitternetz zeichnen
152
153
    myGLCD.setColor(120, 120, 120);
154
    myGLCD.drawLine(51,265,430,265);
155
    myGLCD.drawLine(51,240,430,240);
156
    myGLCD.drawLine(51,215,430,215);
157
    myGLCD.drawLine(51,190,430,190);
158
    myGLCD.drawLine(51,165,430,165);
159
    myGLCD.drawLine(51,140,430,140);
160
    myGLCD.drawLine(51,115,430,115);
161
    myGLCD.drawLine(51,90,430,90);
162
    myGLCD.drawLine(51,65,430,65);
163
    myGLCD.drawLine(51,40,430,40);
164
165
    myGLCD.drawLine(100,40,100,289);
166
    myGLCD.drawLine(150,40,150,289);
167
    myGLCD.drawLine(200,40,200,289);
168
    myGLCD.drawLine(250,40,250,289);
169
    myGLCD.drawLine(300,40,300,289);
170
    myGLCD.drawLine(350,40,350,289);
171
    myGLCD.drawLine(400,40,400,289);
172
173
    
174
    myGLCD.setColor(0, 255, 0);
175
    
176
    for(i = 1; i <= 380; i++)
177
       {
178
        offsetState = digitalRead(offsetPin);    // button for new tara (offset)
179
    
180
        if (offsetState == LOW)
181
           {        
182
            offset = scale.read();   // Einlesen eines Rohwerts zur Ermittlung des offsets
183
           }
184
185
        
186
        //Rohwert = scale.read_average(2);   // Einlesen der gemittelten Rohwerten
187
        Rohwert = scale.read();              // Einlesen eines Rohwerts
188
  
189
        Kraft_neu = (Rohwert - offset) / Scale;  // Berechnung der Kraft in Newton
190
191
        //Serial.println(Rohwert);
192
193
        myGLCD.print("        ", 70, 18);
194
        myGLCD.printNumF(Kraft_neu, 2, 70, 18);
195
        
196
        if(Kraft_neu >= 0 && Kraft_neu <= 10)
197
           {
198
            //myGLCD.drawPixel(50 + i, 290 - Kraft * 25);
199
            myGLCD.drawLine(50 + (i - 1),290 - Kraft_alt * 25,50 + i,290 - Kraft_neu * 25);
200
201
            Kraft_alt = Kraft_neu;
202
           }
203
      
204
       }
205
               
206
   }

von Harald W. (wilhelms)


Lesenswert?

Christoph E. schrieb:

> Hier gibt es ja eine Menge Leute, die über Arduino gewaltig lästern. Ich
> finde ihn für meine Zwecke (in der Regel Physikexperimente bzw.
> Messgeräte für den Physikunterricht) einfach ideal.

Nun, hier dient der Ardino wohl nur als Voltmeter. Das gleiche
könnte man wohl auch mit Loadzelle plus Panelmeter bauen.

von Günni (Gast)


Lesenswert?

Für Sensoranwendungen finde ich den Arduino auch gut geeignet, wobei man 
für die Erfassung schnellerer Bewegungen notfalls auf 
Assemblerprogrammierung übergehen muss. Der Raspberry ist besser 
geeignet, wenn ein höherer Rechenaufwand entsteht, z.B. für 
Bildmustererkennung oder FFT-Analysen.

von Der Hugo (Gast)


Lesenswert?

Ich finde die Idee sehr gut, das im Rahmen der Schule zu nutzen. Oftmals 
wird auf Arduino ja auch später im Rahmen der Ausbildung 
zurückgegriffen, z.B. an (Fach-)Hochschulen. Ich denke, man kann damit 
gar nicht früh genug anfangen, einfach ein Grundverständnis dafür zu 
schaffen und Interesse zu wecken.

Bei den Meisten von uns war das damals einfacher: Der C64 startete immer 
mit diesem "Basic" wo man dann seine Spiele starten konnte, irgendwann 
wollte man mal ausprobieren was das macht...

(Arduino-Bashing ist angebracht, wenn der Bachelor in der Firma damit 
ein "professionelles Produkt" entwickeln möchte, aber doch bestimmt 
nicht, wenn jemand damit zuhause sein Eigenheim automatisieren möchte 
oder andere für Technik begeistern möchte. Ich hätte mir damals einen 
Lehrer mit so viel Begeisterung für Technik gewünscht ...)

FFT Analyse in der Schule? An der FH gibts dafür den Teensy 4.0, an der 
Uni das Beispiel auf Seite 538ff ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.