DIY laser projectors

 

 

 This temporary site is about 2 types of DIY projectors:


- The ARDUINO matrix laser projector

Project goal is to make a simple laser projector similiar to this one

 using only a CPU fan , laser pointer and Arduino board which is 29$ on Sparkfun.

This can have many uses as a cool sign , etc. also , adding more lasers is possible and adds 16 lines of resolution per laser in this case .

using 2 projectors (H and V) we can create a matrix which will be able to project whole words onto buildings.

first part - making a circular type projector:

 

 

 optical transistor is hooked with pull-up resistor to 5v.

here is the output of the RPM measurements , code follows:

time=714
rpm=4200
totaltime=714

time=1805
rpm=1600
totaltime=2519

time=703
rpm=4200
totaltime=3222

time=1791
rpm=1600
totaltime=5013

time=698
rpm=4200
totaltime=5711

time=1801
rpm=1600
totaltime=7512

time=697
rpm=4300
totaltime=8209

time=1821
rpm=1600
totaltime=10030

 I am getting pairs of rpms!!

this is what i get when i dump every rpm pulse with it's timecode:

(measurement # is on left , time code on right) 

1,6 
2,13 

3,19 

4,26 

5,32 

6,39 

7,46 

8,53 

9,59 

10,66 

11,72 

12,79 

13,86 

14,93 

15,99 

16,106 

17,112 

18,119 

19,125 

20,133 

21,139 

22,146 

23,153 

24,159 

25,166 

26,174 

27,181 

28,187 

29,193 

30,200 

31,206 

32,214 

33,220 

34,227 

35,233 

36,239 

37,246 

38,252 

39,260 

40,266 

41,272 

42,279 

43,285 

44,292 

45,299 

46,306 

47,313 

48,319 

49,326 

50,332 

51,339 

52,346 

53,353 

54,359 

55,365 

56,372 

57,378 

58,387 

59,393 

60,399 

61,406 

62,412 

63,419 

64,425 

65,433 

66,439 

67,445 

68,452 

69,458 

70,465 

71,472 

72,479 

73,485 

74,491 

75,498 

76,504 

77,512 

78,518 

79,525 

80,532 

81,538 

82,545 

83,551 

84,559 

85,565 

86,572 

87,578 

88,584 

89,591 

90,599 

91,606 

92,612 

93,619 

94,626 

95,632 

96,640 

97,646 

98,653 

99,659 

100,665 

time=665

rpm=4500

1,689 

2,707 

3,724 

4,742 

5,759 

6,777 

7,794 

8,813 

9,830 

10,847 

11,864 

12,882 

13,901 

14,919 

15,935 

16,953 

17,970 

18,988 

19,1006 

20,1024 

21,1040 

22,1058 

23,1076 

24,1092 

25,1110 

26,1128 

27,1146 

28,1163 

29,1180 

30,1198 

31,1215 

32,1232 

33,1251 

34,1268 

35,1285 

36,1302 

37,1319 

38,1338 

39,1355 

40,1373 

41,1390 

42,1408 

43,1425 

44,1442 

45,1460 

46,1478 

47,1497 

48,1513 

49,1530 

50,1548 

51,1565 

52,1583 

53,1601 

54,1619 

55,1636 

56,1653 

57,1671 

58,1689 

59,1707 

60,1724 

61,1743 

62,1761 

63,1777 

64,1795 

65,1813 

66,1829 

67,1847 

68,1865 

69,1883 

70,1899 

71,1916 

72,1935 

73,1952 

74,1970 

75,1987 

76,2006 

77,2022 

78,2038 

79,2058 

80,2075 

81,2092 

82,2109 

83,2127 

84,2144 

85,2160 

86,2179 

87,2197 

88,2213 

89,2230 

90,2248 

91,2266 

92,2283 

93,2300 

94,2319 

95,2336 

96,2353 

97,2370 

98,2388 

99,2406 

100,2423 

time=1758

rpm=1700

1,2439 

2,2445 

3,2452 

4,2458 

5,2464 

6,2471 

7,2481 

8,2487 

9,2494 

10,2501 

11,2507 

12,2513 

13,2520 

14,2526 

15,2535 

16,2541 

17,2547 

18,2553 

19,2562 

20,2569 

21,2575 

22,2581 

23,2587 

24,2593 

25,2600 

26,2609 

27,2615 

28,2621 

29,2628 

30,2636 

31,2642 

32,2649 

33,2655 

34,2662 

35,2668 

36,2674 

37,2682 

38,2689 

39,2696 

40,2702 

41,2709 

42,2715 

43,2721 

44,2728 

45,2735 

46,2741 

47,2747 

48,2755 

49,2762 

50,2768 

51,2775 

52,2781 

53,2787 

54,2794 

55,2800 

56,2806 

57,2812 

58,2819 

59,2829 

60,2835 

61,2841 

62,2847 

63,2853 

64,2861 

65,2867 

66,2873 

67,2879 

68,2886 

69,2892 

70,2900 

71,2907 

72,2913 

73,2920 

74,2926 

75,2932 

76,2938 

77,2946 

78,2953 

79,2959 

80,2965 

81,2973 

82,2979 

83,2987 

84,2993 

85,2999 

86,3005 

87,3011 

88,3020 

89,3026 

90,3033 

91,3039 

92,3047 

93,3054 

94,3060 

95,3066 

96,3073 

97,3079 

98,3086 

99,3094 

100,3100 

time=677

rpm=4400

1,3123 

 the arduino code -- 

volatile byte rpmcount;
 float rpm;
 unsigned long timeold;
 volatile unsigned long sig;


 void rpm_fun()
 {
   rpmcount++;
   sig=millis();
   Serial.print(rpmcount,DEC);
   Serial.print(",");
   Serial.print(sig);
   Serial.println("  ");
   //Each rotation, this interrupt function is run twice?
 }

 void setup()
 {
   Serial.begin(19200);
   attachInterrupt(0, rpm_fun, FALLING);
   rpmcount = 0;
   rpm = 0;
   timeold = 0;

 }

 void loop()
 {
   if (rpmcount >= 100) {
     //Update RPM every 20 counts, increase this for better RPM resolution,
     //decrease for faster update
     rpm = 30000/(sig-timeold)*rpmcount;
     Serial.print("time=");
     Serial.println(sig-timeold,DEC);
     timeold = sig;
    
     rpmcount = 0;
     Serial.print("rpm=");
     Serial.println(rpm,DEC);

   }
 
    digitalWrite(13, HIGH);   // sets the LED on
   delayMicroseconds(15000000/rpm);

    digitalWrite(13, LOW);    // sets the LED off
   delayMicroseconds(15000000/rpm);

 }


--tried it with "falling" "rising" "low" etc.





- The dual hard drive  projector

Baked , but not throughly.

Hard drive armatures can be driven by sound (like music) from your amp to create movement. this is what these people have done.

what is still needed is a software to either create sound (2 channels) artificially that causes graphics to be displayed. OR - create a software program which can drive the armatures directly and use the relatively high seek time to create actual graphics.



any help? please?  tomXXXsofer@gmail.com   (remove XXX)

 

 

 

 

 

 

 

arduino corner- 

 

 

4th attempt - now laser is working , next step - rpm meter from intel cpu fan!


I am using arduino to make an RPM meter to read the pulses off an ordinary intel cpu fan with 3 leads (+,-, rpm signal)
I tried using digitalread() and pulsein() but I get fuzzy results.
anyone knows how to read those signals reliably?

code examples:




void loop()
 {
 
  scanvalue=digitalRead(7);
  if (scanvalue!=previous_scan) {pulsecount++; previous_scan=scanvalue;}
   
   if (millis() - previousMillis > interval)
  {
   interval=((millis() - previousMillis)/pulsecount)*50
   previousMillis = millis();   
   pulsecount=0;

   //code blinking code here
   }
}