Gast piwo Geschrieben December 18, 2018 at 13:42 Geschrieben December 18, 2018 at 13:42 hallo liebe leute - wie ich sehe geht das einmessen eines neuen sensors beim nicht mehr so locker wie beim v1 ich habe die kurve bzw. die interpolation : wie bekomme ich die in die firmware rein ?? kann leider nicht nur mit dem value-callback alleine arbeiten - BRAUCHE die interne umrechnung um auch den distance-callback nutzen zu können .... lgw danke & lg Zitieren
Gast piwo Geschrieben December 18, 2018 at 15:08 Geschrieben December 18, 2018 at 15:08 ZUSATZINFO: make_lookup_table.py stürzt mit einem value-error ab ... Traceback (most recent call last): File "make_lookup_table.py", line 183, in <module> sample_interpolate(x, y) File "make_lookup_table.py", line 130, in sample_interpolate py = y[0] IndexError: list assignment index out of range ZUSATZINFO2 : meine daten sind sehr wohl interpolierbar : #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals from __future__ import print_function import sys reload(sys) sys.setdefaultencoding('utf8') import numpy as np import scipy.interpolate as ip import matplotlib.pyplot as plt if __name__ == "__main__": ##### x_raw=np.array([ 1754192 , 1557138 , 1421474 , 1318285 , 1237063 , 1179487 , 1120884 , 1083090 , 1046113 , 1009308 , 986943 , 965981 , 946221 , 924989 , 908264 , 894831 , 881177 , 870684 , 860598 , 853558 , 846379 , 840214 , 835445 , 831586 , 826256 ], dtype=np.int64) y_val=np.linspace(80.0,560.0,num=25,endpoint=True,dtype=np.float) # plt.plot(x_raw,y_val,'x') x_val=np.linspace(1754192,826256,num=3000,endpoint=True,dtype=np.int64) #fraw= ip.interp1d(x_raw,y_val,kind='cubic') # #plt.plot(x_val,fraw(x_val),'-') frep=ip.splrep(np.flip(x_raw,0),np.flip(y_val,0),k=3,s=50) # plt.plot(x_val,ip.splev(x_val,frep),'-') plt.show() Zitieren
borg Geschrieben December 19, 2018 at 17:04 Geschrieben December 19, 2018 at 17:04 Das Distance IR Bricklet 2.0 hat genug Flash um die Kalibrierung für alle Sensoren die wir anbieten zu speichern, daher sollte es nicht mehr notwendig sein die Kalibrierung zu ändern. Wenn du eine eigene Kalibrierung benötigst müsstest du die in deinem Programm durchführen. Zitieren
Gast piwo Geschrieben December 19, 2018 at 20:47 Geschrieben December 19, 2018 at 20:47 sehr aufschlussreich ! ich habe oben beschrieben, dass die utility "make_lookup_table.py" die in den sourcen für das distance-ir-v2 ist, aus unerfindlichen gründen die berechnung der spline für folgende daten als input-datei NICHT SCHAFFT : #Count 12000 @DIST 560cm @ms 50 @Tchip 24°C @Tenv 20.00°C #Min 803910 Max 851955 Means : A 826256 H 826201 G 826229 560: 826256 # Count 12000 @DIST 540cm @ms 50 @Tchip 25°C @Tenv 20.00°C # Min 803930 Max 852149 Means : A 831586 H 831536 G 831561 540: 831586 # Count 12000 @DIST 520cm @ms 50 @Tchip 24°C @Tenv 20.00°C # Min 804138 Max 863744 Means : A 835445 H 835398 G 835421 520: 835445 # Count 12000 @DIST 500cm @ms 50 @Tchip 25°C @Tenv 20.00°C # Min 804128 Max 863835 Means : A 840214 H 840168 G 840191 500: 840214 # Count 12000 @DIST 480cm @ms 50 @Tchip 24°C @Tenv 20.00°C # Min 827618 Max 864037 Means : A 846379 H 846338 G 846358 480: 846379 # Count 12000 @DIST 460cm @ms 50 @Tchip 34°C @Tenv 28.81°C # Min 825815 Max 874097 Means : A 853558 H 853523 G 853540 460: 853558 # Count 12000 @DIST 440cm @ms 50 @Tchip 28°C @Tenv 24.18°C # Min 844419 Max 880757 Means : A 860598 H 860568 G 860583 440: 860598 # Count 12000 @DIST 420cm @ms 50 @Tchip 27°C @Tenv 23.43°C # Min 857875 Max 882873 Means : A 870684 H 870668 G 870676 420: 870684 # Count 12000 @DIST 400cm @ms 50 @Tchip 27°C @Tenv 22.93°C # Min 870716 Max 895539 Means : A 881177 H 881158 G 881168 400: 881177 # Count 12000 @DIST 380cm @ms 50 @Tchip 26°C @Tenv 22.62°C # Min 882941 Max 908062 Means : A 894831 H 894820 G 894826 380: 894831 # Count 12000 @DIST 360cm @ms 50 @Tchip 26°C @Tenv 22.37°C # Min 895591 Max 920345 Means : A 908264 H 908257 G 908260 360: 908264 # Count 12000 @DIST 340cm @ms 50 @Tchip 26°C @Tenv 22.06°C # Min 919955 Max 932908 Means : A 924989 H 924961 G 924975 340: 924989 # Count 12000 @DIST 320cm @ms 50 @Tchip 26°C @Tenv 21.93°C # Min 932206 Max 1228906 Means : A 946221 H 945878 G 946038 320: 946221 # Count 12000 @DIST 300cm @ms 50 @Tchip 28°C @Tenv 25.31°C # Min 954186 Max 974734 Means : A 965981 H 965980 G 965980 300: 965981 # Count 12000 @DIST 280cm @ms 50 @Tchip 35°C @Tenv 34.31°C # Min 973083 Max 989785 Means : A 986943 H 986940 G 986941 280: 986943 # Count 12000 @DIST 260cm @ms 50 @Tchip 35°C @Tenv 30.81°C # Min 1006046 Max 1019125 Means : A 1009308 H 1009288 G 1009298 260: 1009308 # Count 12000 @DIST 240cm @ms 50 @Tchip 29°C @Tenv 25.00°C # Min 1033207 Max 1047487 Means : A 1046113 H 1046112 G 1046112 240: 1046113 # Count 12000 @DIST 220cm @ms 50 @Tchip 28°C @Tenv 24.06°C # Min 1070969 Max 1084288 Means : A 1083090 H 1083089 G 1083089 220: 1083090 # Count 12000 @DIST 200cm @ms 50 @Tchip 28°C @Tenv 25.56°C # Min 1118136 Max 1131515 Means : A 1120884 H 1120869 G 1120876 200: 1120884 # Count 12000 @DIST 180cm @ms 50 @Tchip 28°C @Tenv 25.56°C # Min 1167808 Max 1180266 Means : A 1179487 H 1179486 G 1179487 180: 1179487 # Count 12000 @DIST 160cm @ms 50 @Tchip 28°C @Tenv 25.43°C # Min 1236482 Max 1237768 Means : A 1237063 H 1237063 G 1237063 160: 1237063 # Count 12000 @DIST 140cm @ms 50 @Tchip 28°C @Tenv 25.06°C # Min 1316087 Max 1331713 Means : A 1318285 H 1318285 G 1318285 140: 1318285 # Count 12000 @DIST 120cm @ms 50 @Tchip 29°C @Tenv 25.50°C # Min 1420528 Max 1433098 Means : A 1421474 H 1421472 G 1421473 120: 1421474 # Count 12000 @DIST 100cm @ms 50 @Tchip 29°C @Tenv 25.75°C # Min 1546089 Max 1558090 Means : A 1557138 H 1557137 G 1557138 100: 1557138 # Count 12000 @DIST 80cm @ms 50 @Tchip 29°C @Tenv 26.00°C # Min 1743383 Max 1755112 Means : A 1754192 H 1754192 G 1754192 80: 1754192 d.h also, einfach die lookup.c mit eigenen daten für einen existierenden sensor hacken geht scheinbar nicht - ich hab keine ahnung was eure spline da zusammenrechnet !!!!! also bitte keine muffeligen antworten, die keine sind - wenn eure hw was wert sein soll (nicht nur im shop), dann muss sie auch nutzbar sein !!!! ich zitiere aus den docs ".... JEDERZEIT MIT ANDEREN SENSOREN NUTZBAR ..." danke für die zusammenarbeit lg w Zitieren
borg Geschrieben December 19, 2018 at 21:10 Geschrieben December 19, 2018 at 21:10 Deine Analogwerte haben 21 Bit, das Script geht unkonfiguriert von 12 Bit aus. Bitte einmal die neueste Version pullen, ich hab das jetzt klarer gemacht was zu konfigurieren ist. Für deine Datei: # Filename filename = 'DEIN_DATEINAME.txt' # '2Y0A41.txt' / '2Y0A21.txt' / '2Y0A02.txt' # Number of bits of input values ANALOG_BITS = 21 Zitieren
Gast piwo Geschrieben December 20, 2018 at 12:30 Geschrieben December 20, 2018 at 12:30 1) in zeile 135 hat sich noch eine "12" versteckt ... nehme an, das gehört auch durch "ANALOG_BITS" ersetzt ? 2) ich hab das mal gemacht : die daten analog aufbereitet ... #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals from __future__ import print_function from future_builtins import map import sys reload(sys) sys.setdefaultencoding('utf8') import numpy as np import scipy.interpolate as ip import matplotlib.pyplot as plt import math do_plot_sample=False ### equidistant DATA SAMPLE : DESCENDING !!!! # x_sample=np.array([ 1754192 , 1557138 , 1421474 , 1318285 , 1237063 , 1179487 , 1120884 , 1083090 , 1046113 , 1009308 , 986943 , 965981 , 946221 , 924989 , 908264 , 894831 , 881177 , 870684 , 860598 , 853558 , 846379 , 840214 , 835445 , 831586 , 826256 ], dtype=np.int64) # y_sample=np.linspace(80.0,560.0,num=25,endpoint=True,dtype=np.float) # if do_plot_sample: plt.plot(x_sample,y_sample,'x') x_test=np.linspace(x_sample[0],x_sample[-1], num=3000,endpoint=True, dtype=np.int64) #------------> #------------> make_lookup_table.py lines 13, 17, 18 #------------> # ANALOG_BITS = int(math.ceil(math.log(np.amax(x_sample),2))) # log2 of largest input NUM_VALUES = 512 DIVIDER = (2**ANALOG_BITS)//NUM_VALUES ### ### ### SCIPY INTERPOLATION ### interpoaltion method 1 : not as smooth ... #fraw= ip.interp1d(x_sample,y_sample,kind='cubic') #if do_plot_sample: # plt.plot(x_test,fraw(x_test),'-') ### interpolation method 2 : better, easier ... but needs ASCENDING values frep=ip.splrep(np.flip(x_sample,0),np.flip(y_sample,0), k=3,s=50) #------------> #------------> make_lookup_table.py line 126 : px #------------> # px = np.linspace(0,2**ANALOG_BITS, num=NUM_VALUES,endpoint=False, dtype=np.uint64) # #------------> #------------> make_lookup_table.py line 126 ff. : interpolated px -> py clipping @boundaries #------------> # py=np.array([ int(round(y*100.0,0)) for y in ip.splev(px,frep,ext=3) ], dtype=np.uint64) # py_valclip_lower=np.flip(px,0)[np.argmax(np.flip(py,0))] py_valclip_upper=px[np.argmin(py)] print("\nInterpolating {} sample-points :\nX start {} stop {} step {}\nY {} bits min {} max {} clipped between X={} and X={}". format(px.size, np.amin(px),np.amax(px), px[1]-px[0], ANALOG_BITS, np.amin(py), np.amax(py), py_valclip_lower,py_valclip_upper)) print("\n// Custom Sensor Data Record :\n// File 'distance_lookup.c'\n// Replace Record under 'const uint16_t distance_lookup[DISTANCE_SENSOR_NUM][DISTANCE_LOOKUP_SIZE] = { ... }'") print("\n{ ",", ".join( "{}".format(x) for x in np.nditer(py) )," }\n") if do_plot_sample: plt.plot(x_test,ip.splev(x_test,frep),'-') else: plt.axvline(x=py_valclip_lower) plt.axvline(x=py_valclip_upper) plt.plot(px,py,'r',linewidth=1) plt.grid(True) plt.show() output ist : Interpolating 512 sample-points : X start 0 stop 2093056 step 4096 Y 21 bits min 7995 max 56201 clipped between X=823296 and X=1757184 // Custom Sensor Data Record : // File 'distance_lookup.c' // Replace Record under 'const uint16_t distance_lookup[DISTANCE_SENSOR_NUM][DISTANCE_LOOKUP_SIZE] = { ... }' { 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 56201, 55631, 53685, 51908, 50300, 48857, 47562, 46391, 45320, 44327, 43391, 42505, 41666, 40871, 40119, 39407, 38733, 38093, 37487, 36911, 36363, 35841, 35342, 34864, 34404, 33961, 33531, 33113, 32703, 32300, 31901, 31504, 31110, 30718, 30329, 29944, 29563, 29186, 28815, 28449, 28089, 27735, 27389, 27050, 26719, 26396, 26082, 25777, 25481, 25193, 24913, 24641, 24376, 24119, 23869, 23626, 23389, 23159, 22934, 22715, 22502, 22293, 22090, 21891, 21697, 21507, 21321, 21138, 20958, 20782, 20608, 20437, 20268, 20101, 19936, 19773, 19611, 19451, 19293, 19137, 18982, 18830, 18678, 18529, 18381, 18235, 18090, 17947, 17806, 17666, 17528, 17392, 17257, 17123, 16992, 16861, 16732, 16605, 16479, 16355, 16232, 16111, 15991, 15872, 15755, 15639, 15525, 15412, 15300, 15190, 15081, 14973, 14867, 14762, 14658, 14555, 14454, 14354, 14255, 14158, 14061, 13966, 13872, 13780, 13688, 13597, 13508, 13420, 13333, 13246, 13161, 13077, 12995, 12913, 12832, 12752, 12673, 12595, 12519, 12443, 12368, 12294, 12221, 12148, 12077, 12007, 11937, 11868, 11801, 11733, 11667, 11602, 11537, 11473, 11410, 11348, 11287, 11226, 11166, 11106, 11047, 10989, 10932, 10875, 10819, 10764, 10709, 10654, 10601, 10548, 10495, 10443, 10392, 10341, 10290, 10240, 10191, 10142, 10093, 10045, 9998, 9950, 9903, 9857, 9811, 9765, 9720, 9675, 9630, 9586, 9542, 9498, 9455, 9411, 9368, 9326, 9283, 9241, 9199, 9157, 9115, 9073, 9032, 8991, 8949, 8908, 8867, 8826, 8786, 8745, 8704, 8663, 8623, 8582, 8541, 8501, 8460, 8419, 8378, 8337, 8296, 8255, 8214, 8173, 8131, 8090, 8048, 8006, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995, 7995 } plot siehe attachment ... 3) ich erwarte mir bitte eine klare auskunft, - ob die daten so plausibel sind - wie ich das jetzt als ERSATZ für irgendeinen sensor in die firmware reinkriege ich bin nämlich kein experte für den c-code den ihr hier verwendet ... danke & lg wp Zitieren
borg Geschrieben December 20, 2018 at 12:48 Geschrieben December 20, 2018 at 12:48 Die Daten sehen gut aus. Du kannst das ausgegebene Array in distance_lookup.c als letztes Element des Arrays dort hinzufügen und in distance.h DISTANCE_SENSOR_NUM auf 4 setzen. Vorher einmal nochmal pullen, hab in der communication.c eine kleine Änderung gemacht damit du deinen neuen Sensor-Typ auch per set_sensor_type(3) auswählen kannst. Als Anhang einmal die kompilierte Firmware mit deinen Änderungen.distance-ir-v2-bricklet-firmware.zbin Zitieren
Gast piwo Geschrieben December 20, 2018 at 20:55 Geschrieben December 20, 2018 at 20:55 danke - eine super antwort ... werde das morgen probieren !!! lg wolfgang Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.